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个人网站架设连环讲(二)
Oct 09 PHP
PHP下打开URL地址的几种方法小结
May 16 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
Oct 29 PHP
PHP 解决session死锁的方法
Jun 20 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
从wamp到xampp的升级之路
Apr 08 PHP
PHP文件缓存类实现代码
Oct 26 PHP
CI框架简单邮件发送类实例
May 18 PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 PHP
浅谈Laravel核心解读之Console内核
Dec 02 PHP
Smarty模板变量与调节器实例详解
Jul 20 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函数
2006/10/09 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
Angular工具方法学习
2016/12/26 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
Python算法应用实战之队列详解
2017/02/04 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
Python request post上传文件常见要点
2020/11/20 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
如何开发一个JQuery插件
2016/07/28 面试题
电子商务专业个人的自我评价
2013/12/19 职场文书
设计师个人求职信范文
2014/02/02 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
中式婚礼主持词
2014/03/13 职场文书
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS
vue动态绑定style样式
2022/04/20 Vue.js