Laravel 自定义校验怎么灵活的处理
经常会遇到意想不到的校验 比如 怎么校验结束时间 大于开始时间 或者 后面字段需要根据前面一个字段的结果 进行处理 在就是比较麻烦的手机号校验 等一些laravel 本身没有的校验方式。
下面提供两种自定义添加自己的校验规则:
- 方式一:就是使用 Validator::extend
Validator::extend('poly_exists', function ($attribute, $value, $parameters, $validator) { //处理逻辑 $attribute, //属性 $value, //值 $parameters,//额外的参数 $validator,//校验类实例 });
这样需要在AppServiceProvider 里面注册 ,如果自定义的比较多 这样显然不是很优雅,下面提供比较优雅的处理方式:
// validate 是一个校验类 demo 是具体的校验方法
Validator::extend('poly_exists', 'Validate@demo');
-
如果想要根据灵活复杂的校验方式的话,下面根据laravel 自己的校验方式 去实现
- 首先需要创建一个校验服务 在app/Validators 创建 Validation.php 需要继承Validator核心类
namespace App\Validators; use App\Traits\MyValidation; use Illuminate\Validation\Validator; class Validation extends Validator { use MyValidation;
}
- 首先需要创建一个校验服务 在app/Validators 创建 Validation.php 需要继承Validator核心类
-
创建一个具 实现 trait MyValidation
namespace App\Traits; trait MyValidation{ //自定义校验 public function validateDemoTest($attribute, $value, $parameters) { if ($value == 'test') { return false; } return true; } //自定义提示信息 protected function replaceDemoTest($message, $attribute, $rule, $parameters)\ {\ return str_replace([':demo_test'], $parameters, $message);\ } }
-
最后就是注册这个服务
Validator::resolver(function ($translator, $data, $rules, $messages) {
return new Validation($translator, $data, $rules, $messages);
});