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下通过file_get_contents的代理使用方法
Feb 16 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
PHP中echo和print的区别
Aug 28 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
Jul 29 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
php实现用户登陆简单实例
Apr 04 PHP
PHP实现文件上传功能实例代码
May 18 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 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会员权限控制实现原理分析
2011/05/29 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
写一个移动端惯性滑动&回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
TensorFlow打印tensor值的实现方法
2018/07/27 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
PyQt5组件读取参数的实例
2019/06/25 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python怎么自定义捕获错误
2020/06/29 Python
数控机械专业个人的自我评价
2014/01/02 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
教师校本培训方案
2014/02/26 职场文书
《荷花》教学反思
2014/04/16 职场文书
企业法人代表证明书
2014/09/27 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
2014年后勤工作总结
2014/11/18 职场文书
初一语文教学反思
2016/03/03 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
正则表达式拆分url实例代码
2022/02/24 Java/Android