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 相关文章推荐
56.com视频采集接口程序(PHP)
Sep 22 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
php比较相似字符串的方法
Jun 05 PHP
php批量删除超链接的实现方法
Oct 19 PHP
Symfony控制层深入详解
Mar 17 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
php workerman定时任务的实现代码
Dec 23 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php教程之phpize使用方法
2014/02/12 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
JS Array对象入门分析
2008/10/30 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
利用django如何解析用户上传的excel文件
2017/07/24 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
Python如何定义一个函数
2015/09/01 面试题
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
董事长助理岗位职责
2014/02/18 职场文书
学位证书委托书
2014/09/30 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
实习指导老师意见
2015/06/04 职场文书
升学宴学生致辞
2015/07/27 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA