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 Sql Server连接失败问题及解决办法
Aug 07 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
php使用MySQL保存session会话的方法
Jun 26 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 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 session的应用详细介绍
2017/03/22 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
php实现图片压缩处理
2020/09/09 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
前台接待的工作职责
2013/11/21 职场文书
自荐书范文
2013/12/08 职场文书
广告词串烧
2014/03/19 职场文书
铣工实训报告
2014/11/05 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
压缩Redis里的字符串大对象操作
2021/06/23 Redis
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB