自定义验证规则对象( Laravel 5.5 新功能早知道)

file
Laravel 5.5 支持自定义验证规则对象,以此作为使用 Validator::extend 进行 自定义验证规则 的替代方法。

先实现 Illuminate\Contracts\Validation\Rule 接口或使用 Closure 来定义自定义验证规则。 然后自定义规则就可以直接用于验证器。

自定义对象验证规则的例子:

use Illuminate\Contracts\Validation\Rule;

class CowbellValidationRule implements Rule
{
    public function passes($attribute, $value)
    {
        return $value > 10;
    }

    public function message()
    {
        return ':attribute needs more cowbell!';
    }
}

定义自定义规则后,就可以在控制器验证中使用它,如下所示:

public function store()
{
    // Validation message would be "song needs more cowbell!"
    $this->validate(request(), [
        'song' => [new CowbellValidationRule]
    ]);
}

使用 Closure 的例子:

public function store()
{
    $this->validate(request(), [
        'song' => [function ($attribute, $value, $fail) {
            if ($value <= 10) {
                $fail(':attribute needs more cowbell!');
            }
        }]
    ]);
}

如果请求中不存在 song 字段,或者为空,那自定义的规则就不会运行。 如果要即使值为空的时候使用自定义验证对象,那就要使用 ImplicitRule 契约 (contracts)。

use Illuminate\Contracts\Validation\ImplicitRule;

class CowbellValidationRule implements ImplicitRule
{
    public function passes($attribute, $value)
    {
        return $value > 10;
    }

    public function message()
    {
        return ':attribute needs more cowbell!';
    }
}

如果你更想在类中组织自定义规则,那自定义验证规则对象会是 Validator::extend() 风格的自定义规则的绝佳选择。另外,从验证器跳转到规则源代码可以比使用 Validator::extend() 定义的基于字符串的自定义规则更方便。

Closure 风格的自定义验证规则应用于简单的一次性需求那可是极好的,实际上在不离开控制器的情况下测试自定义验证规则是非常方便的。 可以使用 Closure 来测试自定义规则,如果规则被证明是有用的,再将其移动到对象中去。

查看这个功能的 PR 可以知道它是如何实现和测试的。

参考链接:https://laravel-news.com/custom-validation...

本作品采用《CC 协议》,转载必须注明作者和本文链接
Stay Hungry, Stay Foolish.
本帖由 Summer 于 6年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

等 5.5 正式发布时间还要多久,着急了都要

6年前 评论

请教大佬:
我想定义像 after:date 这种涉及多个字段的规则要怎么定义呢

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!