3分钟短文 | Laravel表单验证没规则可用?你试试自定义,真香!

2020-08-18 14:23:21 浏览数 (1)

引言

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'
];

0 人点赞