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

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

Version

  • Laravel 5.5.40
  • PHP 7.1

开始以前,为方便查看结果,在/Exceptions/Handler.php文件捕获了异常 那么咱们开始作一个验证吧:php

  • 新建一个request并注入到须要验证控制器的方法
  • 下图圈出的红色部分,需改为return true由于咱们身份验证通常不在这里验证
  • 如上图,end_date能够很简单的经过start_date来限制时间范围,那么start_date该怎么验证呢?我原本想的是这样的。
  • 经过增长一个额外的字段curr_date,而后start_date经过这个字段限制范围。测试发现实际并不生效。直接进入了控制器打印的数据
  • 调试了一下,我在Illuminate\Validation\Concerns、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方法写的天然不生效了,以后的验证便没法继续进行
相关文章
相关标签/搜索