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写的serv-u的web申请账号的程序
Oct 09 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
php使用qr生成二维码的示例分享
Jan 20 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
Apr 21 PHP
php反射类ReflectionClass用法分析
May 12 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
Aug 12 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
PHP的消息通信机制测试实例
Nov 10 PHP
PHP实现简单计算器小程序
Aug 28 PHP
PHP date()格式MySQL中插入datetime方法
Jan 29 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/02 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
js确定对象类型方法
2012/03/30 Javascript
JS求平均值的小例子
2013/11/29 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
用python绘制樱花树
2020/10/09 Python
基于Python正确读取资源文件
2020/09/14 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
怎么写有吸引力的自荐信
2013/11/17 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
2015新学期家长寄语
2015/02/26 职场文书
医院合作意向书范本
2015/05/08 职场文书
走进毛泽东观后感
2015/06/04 职场文书
四风之害观后感
2015/06/09 职场文书
Pandas数据类型之category的用法
2021/06/28 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏