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 zlib压缩和解压缩swf文件的代码
Dec 30 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
PHP浮点数精度问题汇总
May 13 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
微信支付PHP SDK ―― 公众号支付代码详解
Sep 13 PHP
php实现头像上传预览功能
Apr 27 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 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
是否存在第一台收音机的说法
2021/03/01 无线电
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python实现的Iou与Giou代码
2020/01/18 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
介绍一下Linux文件的记录形式
2012/04/18 面试题
实习鉴定范文
2013/12/19 职场文书
求职意向书
2014/04/01 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android
GPU服务器的多用户配置方法
2022/07/07 Servers
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers
Python如何加载模型并查看网络
2022/07/15 Python