Laravel 5.5 的自定义验证对象/类示例代码详解


Posted in PHP onAugust 29, 2017

Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的 Validator::extend 方法的替代。

Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的 Validator::extend 方法的替代。。很多时候我们会直接用正则表达式来处理这种特殊的验证,也有时候我们会选择用 Validator::extend 来扩展一个自定义的规则。但在 Laravel 5.5 版本中,我们有了新的手段,只要定义一个实现 Illuminate\Contracts\Validation\Rule 接口的类即可实现自定义的验证规则,并可以直接使用。

下面是一个简单的示例:

use Illuminate\Contracts\Validation\Rule;
class IsOddValidationRule implements Rule
{
  public function passes($attributes, $value)
  {
    return ($value % 2 !== 0);
  }
  public function message()
  {
    return ':attribute 必须是奇数';
  }
}

以上代码定义了一个 IsOddValidationRule 的自定义验证类,在 Controller 中要使用这个验证类的话,可以这样写:

public function handlForm(Request $request)
{
  $this->validate($request, [
    'oddField' => [new IsOddValidationRule]
  ]);
}

同样的效果,也可以通过匿名函数(闭包函数)来实现:

public function handleForm(Request $request)
{
  $this->validate($request, [
    'oddField' => [function($attributes, $value, $fail) {
      if ($value % 2 === 0) {
        $fail(':attribute 必须是奇数!');
      }
    }]
  ]);
}

在验证的表单项为空值或者不存在的时候,对应的自定义验证规则不会执行。这个与系统自带的验证规则的逻辑是一致的。如果你希望你的自定义验证规则,即使是在对应的表单项为空值时也被执行的话,那么只要把继承的接口从 rule 改成 ImplicitRule 即可:

class IsOddValidationRule implements ImplicitRule
{
  ...
}

采用 Laravel 5.5 新增的自定义验证类,可以更好地管理大量的自定义验证规则,而且在 PHPStorm 之类的 IDE 中,从验证代码里快速跳转到对应的验证类的代码也会更方便。毕竟采用 Validator::extend 的话,你只能通过搜索对应验证类名称的字符串来找到规则定义的源代码。

匿名函数的自定义验证规则在一次性的简单验证逻辑中用起来确实会很方便,或者是在编码过程中快速测试验证逻辑也很实用。但是总的来说,还是建议采用更具组织性和可读性的自定义验证类。最佳方法是在编写 Controller 的过程中用匿名函数快速验证自定义规则,然后再把它移到自定义的验证类对象中。

你可以查看该功能在 Laravel 框架的 github 上的 Pull Request ,阅读具体的实现代码以及相关的测试代码。

参考

https://github.com/laravel/framework/pull/19155/files
https://laravel-news.com/custom-validation-rule-objects

总结

以上所述是小编给大家介绍的Laravel 5.5 的自定义验证对象/类示例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
PHP可变变量学习小结
Nov 29 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
Dec 25 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
php中时间函数date及常用的时间计算
May 12 PHP
PHP 爬取网页的主要方法
Jul 13 PHP
laravel5实现微信第三方登录功能
Dec 06 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 PHP
PHP单例模式与工厂模式详解
Aug 29 #PHP
PHP迭代与递归实现无限级分类
Aug 28 #PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 #PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 #PHP
You might like
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
php Smarty模板生成html文档的方法
2010/04/12 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
浅析php工厂模式
2014/11/25 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
js window.print实现打印特定控件或内容
2013/09/16 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python中的pprint折腾记
2015/01/21 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
python 性能优化方法小结
2017/03/31 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
python实现飞船大战
2020/04/24 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
请说出几个常用的异常类
2013/01/08 面试题
异常和异常类的概念
2014/09/12 面试题
部队党性分析材料
2014/02/16 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
使用python求解迷宫问题的三种实现方法
2022/03/17 Python