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 相关文章推荐
PHP4实际应用经验篇(1)
Oct 09 PHP
MySql中正则表达式的使用方法描述
Jul 30 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 PHP
PHP开发微信支付的代码分享
May 25 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
PHP开发API接口签名生成及验证操作示例
May 27 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+DBM的同学录程序(3)
2006/10/09 PHP
php cookis创建实现代码
2009/03/16 PHP
php 地区分类排序算法
2013/07/01 PHP
Destoon模板制作简明教程
2014/06/20 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
许愿墙中用到的函数
2006/10/07 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
浅谈js闭包理解
2019/04/01 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
Django 反向生成url实例详解
2019/07/30 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
艺术专业大学生自我评价
2013/09/22 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
就业协议书范本
2014/10/08 职场文书
给朋友的道歉短信
2015/05/12 职场文书
色戒观后感
2015/06/12 职场文书
安全守法证明
2015/06/23 职场文书
护士岗位竞聘书
2015/09/15 职场文书