自定义验证规则对象( 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-rule-objects

Stay Hungry, Stay Foolish.