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+MYSQL的文章管理系统(二)
Oct 09 PHP
如何在PHP中使用Oracle数据库(2)
Oct 09 PHP
PHP页面间传递参数实例代码
Jun 05 PHP
使用PHP获取网络文件的实现代码
Jan 01 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
php_screw 1.5:php加密: 安装与使用详解
Jun 20 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
PHP培训要多少钱
Jun 06 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 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循环输出数据库内容的代码
2008/05/24 PHP
yii框架builder、update、delete使用方法
2014/04/30 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
js实现二代身份证号码验证详解
2014/11/20 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
Python新手实现2048小游戏
2015/03/31 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
python WindowsError的错误代码详解
2017/07/23 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python爬虫与反爬虫大战
2020/07/30 Python
详解Python流程控制语句
2020/10/28 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
python实现计算器简易版
2020/12/17 Python
销售演讲稿范文
2014/01/08 职场文书
爱国电影观后感
2015/06/19 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers