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的库,结果发现很多东西
Dec 31 PHP
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
PHPEXCEL 使用小记
Jan 06 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
一个不易被发现的PHP后门代码解析
Jul 05 PHP
php中实现记住密码下次自动登录的例子
Nov 06 PHP
PHP 7.0.2 正式版发布
Jan 08 PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
Mar 21 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 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抓取https的内容的代码
2010/04/06 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
使用JS动态显示文本
2017/09/09 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
泛谈JS逻辑判断选择器 || &&
2019/05/24 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python生成式的send()方法(详解)
2017/05/08 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
详解python配置虚拟环境
2019/04/08 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
什么是Python中的匿名函数
2020/06/02 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
判断单链表中是否存在环
2012/07/16 面试题
简历里的自我评价范文
2014/02/24 职场文书
投标保密承诺书
2014/05/19 职场文书
质量承诺书格式
2014/05/20 职场文书
银行求职信范文
2014/05/26 职场文书
公司辞职信模板
2015/05/13 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技