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 相关文章推荐
关于BIG5-HKSCS的解决方法
Mar 20 PHP
PHP Memcached应用实现代码
Feb 08 PHP
file_get_contents获取不到网页内容的解决方法
Mar 07 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
PHP生成随机数的方法实例分析
Jan 22 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
纯php生成随机密码
Oct 30 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
10个值得深思的PHP面试题
Nov 14 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PHP isset()及empty()用法区别详解
Aug 29 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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中常用编辑器推荐
2007/01/02 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
招商专员岗位职责
2014/02/08 职场文书
三行辞职书范文
2015/02/26 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
SQLServer常见数学函数梳理总结
2022/08/05 MySQL