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递归列出所有文件和目录的代码
Sep 10 PHP
php中mysql模块部分功能的简单封装
Sep 30 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
php导入模块文件分享
Mar 17 PHP
PHP实现批量删除(封装)
Apr 28 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 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
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
javascript 模拟点击广告
2010/01/02 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
js单词形式的运算符
2014/05/06 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
JavaScript中的闭包
2016/02/24 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
全面理解闭包机制
2016/07/11 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
Angular4 反向代理Details实践
2018/05/30 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
Python入门篇之文件
2014/10/20 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
Python实现的桶排序算法示例
2017/11/29 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python基于http下载视频或音频
2018/06/20 Python
python 获取图片分辨率的方法
2019/01/08 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
中学生获奖感言
2014/02/04 职场文书
环境卫生标语
2014/06/09 职场文书
广播体操比赛口号
2014/06/10 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
隐形的翅膀观后感
2015/06/10 职场文书