自定义验证规则对象( Laravel 5.5 新功能早知道)
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 可以知道它是如何实现和测试的。
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer
于 7年前 加精
等 5.5 正式发布时间还要多久,着急了都要
请教大佬:
我想定义像 after:date 这种涉及多个字段的规则要怎么定义呢