laravel auth(api)->attempt 返回false_3分钟短文 | Laravel表单验证没规则可用?你试试自定义,真香...

引言

Laravel内部提供了很多用于表单验证的规则,都是通过 Validator 对象进行解析和处理。 但是我们会遇到现有规则无法满足验证需求的情况。

597f804d089f8bd4b7cb0b8de118a83a.png

今天我们就来说一个需求,如何验证一个整数字段比另外一个整数字段的值大?

学习时间

假设有两个字段 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 :-)

我是@程序员小助手,持续分享编程知识,欢迎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值