使用Zend_Filter_Input验证日期

时间:2012-09-25 11:46:52

标签: php validation zend-framework zend-validate

我正在使用ZF 1.11并希望使用Zend_Form验证非Zend_Filter_Input。我已经成功设置了我的基本验证,但是我试图在将信用卡发送到处理器之前预先验证信用卡到期日期,大于今天的月/年。

这可能吗?我没有在their docs上看到任何具体的日期验证,只是将月/年字段验证为某个范围内的数字。

编辑:我想在不创建新验证类(或扩展/实现现有验证类)的情况下执行此操作,正如我在其他问题上看到的那样。

1 个答案:

答案 0 :(得分:2)

一般情况下,我建议编写一个自定义验证器,因为在我看来,这是在ZF中处理此类案例的最简洁方法。

据我所知,Date验证器只检查日期的正式有效性,但无法比较两个日期。但是,由于只使用内置Zend Framework验证器的限制,我想出了一个使用GreaterThan验证器的有点hacky解决方案:

<?php
$year = 2012;
$month = 1;
$inputDatePast = intval(sprintf('%4d%02d', $year, $month)); //201201

$year = 2016;  // if you read this after september 2016: add a few more years here ;)
$month = 9;
$inputDateFuture = intval(sprintf('%4d%02d', $year, $month)); //201609

$prevMonth = intval(date('Ym', mktime(12, 0, 0, date('n')-1, 1, date('Y'))));

$validator = new Zend_Validate_GreaterThan($prevMonth);
$validator->isValid($inputDatePast); // false
$validator->isValid($inputDateFuture); // true
?>

因此,我们的想法是在上个月的年份和月份中创建一个整数,并比较给定年份和月份是否大于此值。该整数由年份的四位数和月份的两位数(前导零很重要)创建。

例如,2012年9月是201209.如果用户输入2011年10月,那将是201109,小于201209,因此评估为假。另一方面,如果用户输入2014年1月,那么201401将大于上一个日期。

请注意,这只是一个未经测试的草图,可能需要更多的考虑和验证。