转自:https://learnku.com/docs/laravel/5.4/validation/1234#custom-validation-rules
自定义验证规则
Laravel 提供了许多有用的验证规则。但你可能想自定义一些规则。注册自定义验证规则的方法之一,就是使用 Validator
Facade 中的 extend
方法,让我们在 服务提供者 中使用这个方法来注册自定义的验证规则:
<?php namespace AppProviders; use IlluminateSupportServiceProvider; use IlluminateSupportFacadesValidator; class AppServiceProvider extends ServiceProvider { /** * 启动任意应用程序服务。 * * @return void */ public function boot() { Validator::extend('foo', function ($attribute, $value, $parameters, $validator) { return $value == 'foo'; }); } /** * 注册服务容器。 * * @return void */ public function register() { // } }
自定义的验证闭包接收四个参数:要被验证的属性名称 $attribute
,属性的值 $value
,传入验证规则的参数数组 $parameters
,及 Validator
实例。
除了使用闭包,你也可以传入类和方法到 extend
方法中:
Validator::extend('foo', 'FooValidator@validate');
自定义错误消息
另外你可能还需要为自定义规则来定义一个错误消息。这可以通过使用自定义内联消息数组或是在验证语言包中加入新的规则来实现。此消息应该被放在数组的第一级,而不是被放在 custom
数组内,这是仅针对特定属性的错误消息:
"foo" => "你的输入是无效的!", "accepted" => ":attribute 必须被接受。", // 其余的验证错误消息...
当你在创建自定义验证规则时,你可能需要定义占位符来取代错误消息。你可以像上面所描述的那样通过 Validator
Facade 来使用 replacer
方法创建一个自定义验证器。通过 服务提供者 中的 boot
方法可以实现:
/** * 启动任意应用程序服务。 * * @return void */ public function boot() { Validator::extend(...); Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) { return str_replace(...); }); }
隐式扩展功能
默认情况下,若有一个类似 required
这样的规则,当此规则被验证的属性不存在或包含空值时,其一般的验证规则(包括自定扩展功能)都将不会被运行。例如,当 integer 规则的值为 null 时 unique
将不会被运行:
$rules = ['name' => 'unique']; $input = ['name' => null]; Validator::make($input, $rules)->passes(); // true
如果要在属性为空时依然运行此规则,则此规则必须暗示该属性为必填。要创建一个「隐式」扩展功能,可以使用 Validator::extendImplicit()
方法:
Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) { return $value == 'foo'; });
{note} 一个「隐式」扩展功能只会 暗示 该属性为必填。它的实际属性是否为无效属性或空属性主要取决于你。