引言
Laravel内部提供了很多用于表单验证的规则,都是通过 Validator 对象进行解析和处理。但是我们会遇到现有规则无法满足验证需求的情况。
今天我们就来说一个需求,如何验证一个整数字段比另外一个整数字段的值大?
学习时间
假设有两个字段 initial_page 和 end_page,接收到请求参数之后,经过如下的规则过滤:
代码语言:javascript复制'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 方法内写入下面的代码:
代码语言:javascript复制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 的逻辑条件。对于验证失败返回的错误信息,使用下面的代码:
代码语言:javascript复制Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) {
return str_replace(':field', $parameters[0], $message);
});
以上两个方式准备完毕后,就可以在验证规则内使用了:
代码语言:javascript复制$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'
];