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 相关文章推荐
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
php绘制一条直线的方法
Jan 24 PHP
54个提高PHP程序运行效率的方法
Jul 19 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 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/04 PHP
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
vue双向数据绑定知识点总结
2018/04/18 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
Python urlopen 使用小示例
2008/09/06 Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
基于Python的身份证号码自动生成程序
2014/08/15 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python实现类的静态变量用法实例
2015/05/08 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
Python探索之Metaclass初步了解
2017/10/28 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
历史学专业推荐信
2013/11/06 职场文书
学生处主任岗位职责
2013/12/01 职场文书
个人求职信范文分享
2013/12/13 职场文书
大学军训感言800字
2014/02/27 职场文书
局火灾防控工作方案
2014/05/25 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
MySQL数据库查询之多表查询总结
2022/08/05 MySQL