ZF2 Zend \ Validator \ DateStep致命错误:最长执行时间为30秒

时间:2014-05-08 09:38:07

标签: php validation datetime zend-framework2

所以这是我的情况我正在设置一个表格,其中包含一个日期时间字段

$this->form->add(array(
    'type'       => 'Zend\Form\Element\DateTime',
    'name'       => 'date',
    'options'    => array(
        'label'  => 'published_from',
        'format' => 'Y-m-d H:i:s'
    ),
    'attributes' => array(
        'class'     => 'datePicker form-control',
        'readonly'  => 'readonly',
        'data-type' => 'date'         
    ),
));

没有最小/最大值或步骤,应用默认值,然后我以这样的形式显示它

<?php echo $this->formDateTime($form->get('date')); ?>

现在,一旦我提交此表单,内置验证过滤器就会启动并在通过所有初始验证后,它会触及类Zend \ Validator \ DateStep行347-362

   if ($baseDate < $valueDate) {
        while ($baseDate < $valueDate) {
            $baseDate->add($step);

            if ($baseDate == $valueDate) {
                return true;
            }
        }
    } else {
        while ($baseDate > $valueDate) {
            $baseDate->sub($step);
            if ($baseDate == $valueDate) {
                return true;
            }
        }
    }

它落在一个明显无限的循环中并超时。如果是$ baseDate =

,$ baseDate和$ valueDate在第一次命中时的值
object(DateTime)#345 (3) { 
   ["date"]=> string(19) "1970-01-01 01:00:00" 
   ["timezone_type"]=> int(3) 
   ["timezone"]=> string(13) "Europe/London" 
} 

和$ valueDate =

object(DateTime)#442 (3) { 
    ["date"]=> string(19) "2014-05-07 16:57:54" 
    ["timezone_type"]=> int(3) 
    ["timezone"]=> string(13) "Europe/London" 
}

我做错了什么???

1 个答案:

答案 0 :(得分:0)

虽然您没有最小值/最大值或步长,但错误表明您在某处设置了DateStep InputFilter:

    $inputFilter->add( array(
        'name'     => 'deadline',
        'required' => false,
        'validators' => array(
            array(
                'name'    => 'DateStep',
                'options' => array(
                    'step' => new \DateInterval("P2D"),
                    'baseValue' => new \DateTime(),
                    'format'    => 'd/m/Y H:i:s',
                    'messages' => array( \Zend\Validator\DateStep::NOT_STEP => 'Must be at least two days in the future'),
                ),
            ),
        ),
    ));

如果您将日期验证程序设置为使用DateTime:

,则会出现此执行时错误
'type'       => 'Zend\Form\Element\DateTime',

将其设置为:

'type'       => 'Zend\Form\Element\Date',

代替。