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 相关文章推荐
在线增减.htpasswd内的用户
Oct 09 PHP
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
PHP与SQL注入攻击[二]
Apr 17 PHP
PHP中simplexml_load_string函数使用说明
Jan 01 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
php绘制一个矩形的方法
Jan 24 PHP
php获取网页上所有链接的方法
Apr 03 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
Jul 03 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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实现显示照片exif信息的方法
2014/07/11 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
深入理解React中何时使用箭头函数
2017/08/23 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
Python Flask-web表单使用详解
2017/11/18 Python
Selenium定位元素操作示例
2018/08/10 Python
Python hmac模块使用实例解析
2019/12/24 Python
jupyter notebook实现显示行号
2020/04/13 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
基于python实现坦克大战游戏
2020/10/27 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
办公室前台岗位职责
2014/01/04 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
学党史心得体会
2014/09/05 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
新人入职感言
2015/07/31 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers