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 相关文章推荐
如何删除多级目录
Oct 09 PHP
PHP MSSQL 存储过程的方法
Dec 24 PHP
php+mysql事务rollback&commit示例
Feb 08 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
PHP实现今天是星期几的几种写法
Sep 26 PHP
header导出Excel应用示例
Jan 24 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 PHP
thinkphp 框架数据库切换实现方法分析
May 18 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
python实现ipsec开权限实例
2014/11/11 Python
python定时执行指定函数的方法
2015/05/27 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
python奇偶行分开存储实现代码
2018/03/19 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
活动总结怎么写
2014/04/28 职场文书
欢迎新生标语
2014/10/06 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
典型事迹材料范文
2014/12/29 职场文书
2019假期福利管理制度!
2019/07/15 职场文书