引言
Laravel内部提供了很多用于表单验证的规则,都是通过 Validator 对象进行解析和处理。 但是我们会遇到现有规则无法满足验证需求的情况。
今天我们就来说一个需求,如何验证一个整数字段比另外一个整数字段的值大?
学习时间
假设有两个字段 initial_page 和 end_page,接收到请求参数之后,经过如下的规则过滤:
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5','end_page' => 'required_with:initial_page|integer|min:2|digits_between:1,5'
规则中使用 required_with 选项限制一个另一个字段存在时执行的验证规则。 那么如何实现,end_page 字段的值,一定比 initial_page 的值大呢? 为了验证方式的统一,不准备把这个规则写到控制器逻辑内。用laravel的方式该如何实现呢?
laravel内我们可以使用扩展功能,自定义验证规则,扩展 Validator 对象的验证规则。 我们需要把扩展规则写到 AppServiceProvider 内,使得系统加载时可以正确地使用。 在 boot 方法内写入下面的代码:
Validator::extend('greater_than_field', function($attribute, $value, $parameters, $validator) { $min_field = $parameters[0]; $data = $validator->getData(); $min_value = $data[$min_field]; return $value > $min_value;});
其中 greater_than_field 是验证规则的缩写,我们只需传入验证参数,指定返回 true 、false 的逻辑条件。 对于验证失败返回的错误信息,使用下面的代码:
Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) { return str_replace(':field', $parameters[0], $message);});
以上两个方式准备完毕后,就可以在验证规则内使用了:
$rules = [ 'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|integer|greater_than_field:initial_page|digits_between:1,5'];
上面的方式是laravel提供的自定义验证规则,在早期版本内非常有用。如果你使用的laravel框架版本较新, 那么就可以使用一些比较人性化的特性,比如 5.6 版本以上,可以使用 gt lt gte lte 这些方式验证, 写起来也很简单:
$rules = [ 'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|integer|gt:initial_page|digits_between:1,5'];
是不是轻省多了?
写在最后
虽然自定义验证规则复杂而麻烦,但是它却可以教我们从框架的角度解决问题,而且这种灵活的方式, 可以一直延伸下去。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎