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 相关文章推荐
php正则
Jul 07 PHP
超级简单的发送邮件程序
Oct 09 PHP
php is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
PHP分页类集锦
Nov 18 PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 PHP
php常用图片处理类
Mar 16 PHP
Ajax+PHP实现的分类列表框功能示例
Feb 11 PHP
Yii框架的布局文件实例分析
Sep 04 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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
一端时间轮换的广告
2006/06/26 Javascript
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
Python打印输出数组中全部元素
2018/03/13 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
区分python中的进程与线程
2020/08/13 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
酒店经理职责
2014/01/30 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
2015年电工工作总结
2015/04/10 职场文书
离婚答辩状范文
2015/05/22 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书