Laravel日期验证未能要求4位数年份

时间:2014-10-24 18:33:52

标签: validation date laravel-4

我对从Laravel日期验证得到的结果感到困惑。有问题的规则是:

'date_of_birth'=>array('required', 'date_format:n/j/Y')

我发现的是,如果有人进入10/12/13,它会通过验证,并存储为10/12/0013。显然,这并不好。有没有办法通过验证来要求四位数的年份?我认为格式中的Y会做什么。

1 个答案:

答案 0 :(得分:2)

发表评论作为答案

注意:这与this question以及那里的一般性讨论有关。解决方法已在this answer上发布在上述问题上。 this comment中提到了PHP错误。所以我不赞成这个解决方案。

答案:这似乎是PHP函数date_parse_from_format()中的一个错误。您可以通过使用正则表达式指定更严格的规则来解决此问题:

array('required', 'date_format:n/j/Y', 'regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/')
如果你不熟悉正则表达式,那么一开始可能看起来很复杂,但是如果你把它分开,它就会说:

[0-9]{2} =必须有2个后续数字,每个数字在0到9之间。

[0-9]{4} =必须有4个后续数字,每个数字在0到9之间。

\/ =必须有斜线。它被反斜杠逃脱了。

但是:就个人而言,我不太喜欢这个解决方案。即使它确保了四位数的年份,也可以使用像99,99/99999这样的日期。仍然会过去。

{<1}}解决方法的情况 。所以,即使它没有按预期使用,我仍然会使用

after:01-01-1900

(或者可能稍微调整一下正则表达式。)。

要记住一件事:它有效,但我不太清楚为什么。后过滤器上的基础PHP函数是DateTime::createFromFormat()

'date_of_birth'=>array('required', 'date_format:"n/j/Y"', 'after:01-01-1900')

给我一​​个&#39; 10007-06-07&#39;的日期,实际上应该在&01; 01-01-1900&#39;之后,但验证器失败 - 可能是因为比较两个日期,可能是因为无效的值。我不知道它是如何计算的。这有点不可预测的行为,所以谨慎处理:)

如果它很愚蠢但它有效,那就不傻了。 - 墨菲定律