资讯专栏INFORMATION COLUMN

Laravel中优雅的验证日期需要大于今天

summerpxy / 2181人阅读

摘要:我们有时会碰到一个场景,比如买车票,需要进行查询车票剩余,这时候需要一个日期范围,开始日期必须大于等于今天,结束日期必须大于等于开始日期。通过增加一个额外的字段,然后通过这个字段限制范围。测试发现实际并不生效。

我们有时会碰到一个场景,比如买车票,需要进行查询车票剩余,这时候需要一个日期范围,开始日期必须大于等于今天,结束日期必须大于等于开始日期。

Version

Laravel 5.5.40

PHP 7.1


开始之前,为方便查看结果,在/Exceptions/Handler.php文件捕获了异常

那么我们开始做一个验证吧:

新建一个request并注入到需要验证控制器的方法

下图圈出的红色部分,需改成return true因为我们身份验证一般不在这里验证

如上图,end_date可以很简单的通过start_date来限制时间范围,那么start_date该怎么验证呢?我本来想的是这样的。

通过增加一个额外的字段curr_date,然后start_date通过这个字段限制范围。测试发现实际并不生效。直接进入了控制器打印的数据

调试了一下,我在IlluminateValidationConcerns、ValidatesAttributes::validateAfterOrEqual方法跳到compareDates方法,并尝试打印了$this->getValue($parameters[0])这时候的$paramters[0]curr_date总是null


然后查阅了一下源码,知道了原因,直接说能正确验证的方法,再说详细的过程。

正确的方法是这样的

重写父类的prepareForValidation方法,之后再测试

这时候得到想要的验证了


分析一下过程

能通过依赖注入实例化我们想要的对象,这一切都得感谢LaravelIoC容器

容器每次解析完新对象之后,总是会释放一些绑定的事件

这些事件很多都是通过服务提供者来绑定的,我们直接查看config/app.php里有关表单验证的服务提供者



我们可以看到当实现ValidatesWhenResolved对象的类在解析之后会自动调用validate方法

回到新建的IndexTicketRequest类,没有这个方法,去到父类,发现实现了ValidatesWhenResolved,而validate是在traitValidatesWhenResolvedTrait

这个类找到了答案,在validate方法里分三步主要的

$this->prepareForValidation() 在验证之前的准备

新建一个验证实例

开始验证

之所以是需要在验证之前设置curr_date,我们来看看新建验证实例便知道答案


这里有一个地方导致我们的问题出现,就是先调用了$this->validationData()方法拿到request的数据,然后再通过$this->container->call([$this, "rules"])拿到验证规则,所以我们在rules方法写的自然不生效了,之后的验证便无法继续进行

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30893.html

相关文章

  • Laravel 用户多字段认证优雅解决方案

    摘要:弊端显而易见,如果另一个不是就抓瞎了,下面是另一种通用的解决方案在中重写方法假设字段是假设字段是假设字段是可以看到虽然能解决问题,但是显然有悖于的优雅风格,卖了这么多关子,下面跟大家分享一下我的解决方案。 解决方案: 登录字段不超过两个的(简单的解决方案) 登录字段大于或等于三个的(相对复杂一些) 登录字段不超过两个的 我在网上看到一种相对简单解决方案,但是不能解决所有两个字段的验...

    jk_v1 评论0 收藏0
  • WebGeeker-Validation: 一个强大 PHP 参数验证

    摘要:用于对接口的请求参数进行合法性检查。唯一不符合这一规则的是字符串型验证器,它们一部分以开头的,但也有一部分不以开头,比如等。验证型参数型验证器只有两个合法的取值为字符串忽略大小写。合法的取值为字符串忽略大小写例完整的型验证器的列表参考附录。 用于对API接口的请求参数进行合法性检查。 在实现服务端的API接口时,对于每一个接口的每一个参数,都应该检测其取值是否合法,以免错误的数据输入到...

    zzzmh 评论0 收藏0
  • 【日常手记】之Laravel5.3

    摘要:个人网站最近刚写了一个手机在线播放的电影站使用日常手记更新使用的的查询作用域的本地作用域去自定义可复用的约束集合,方便链式调用什么是本地查询作用域本地作用域允许我们定义通用的约束集合以便在应用中复用。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:...

    kidsamong 评论0 收藏0
  • laravel优雅分表关联查询(性能较好,SQL数量=表数量,涵盖了较多laravel手册推

    摘要:最优就只能是查询表的数量才算是比较合理,完全有足够的能力写出优雅的代码很多人可能会想到的原生查询了么。但是有强大的关联,访问器修改,查询范围等等这些功能让你的代码非常简洁。相信熟悉的人已经知道怎么查询了,可以达到最优化的,和最优雅的写法。 终于被产品的各种刁钻不合常理的需求磨炼出用laravel写出较为优雅的代码,在这里给大家分享一下。 先简单介绍一下基本环境,我们是做一款直播APP的...

    mylxsw 评论0 收藏0
  • Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率)

    摘要:小红要以最低成本最快速度推出版本,投放市场,收集反馈,持续迭代。总结在技能掌握充足的情况下,个人感觉开发效率要略高于。 我个人是比较不喜欢去正儿八经的比较两个框架的,这样没有意义,不过欲善其事先利其器! 技术是相通的,但是在某个特定的领域的某个阶段肯定有相对最适合的一个工具! 这里比较不是从技术角度比较,而是从公司技术选型考虑的,特别是初创的互联网创业公司。没办法,谁让互联网公司离不开...

    tinna 评论0 收藏0

发表评论

0条评论

summerpxy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<