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
PHP4实际应用经验篇(2)
Oct 09 PHP
PHP+MySQL5.0中文乱码解决方法
Nov 20 PHP
Discuz 模板引擎的封装类代码
Jul 18 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
Yii 框架入口脚本示例分析
May 19 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 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
php 魔术方法使用说明
2009/10/20 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
自己使用总结Python程序代码片段
2015/06/02 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
python复制文件到指定目录的实例
2018/04/27 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
python 如何停止一个死循环的线程
2020/11/24 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
办公室文员自荐书
2014/02/03 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
2016年寒假家长评语
2015/10/10 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python