【问题标题】:ZF2 Captcha validation ignored when using an input filter使用输入过滤器时忽略 ZF2 验证码验证
【发布时间】:2014-07-16 10:21:21
【问题描述】:

我的 ZF2 应用程序中有一个带有验证码元素的表单,如下所示:

$this->add(array(
        'type' => 'Zend\Form\Element\Captcha',
        'name' => 'captcha',
        'attributes' => array(
            'class'=>'form-control',
        ),
        'options' => array(
            'label' => 'Please verify you are human.',
            'captcha' => array('class' => 'Dumb')
        ),
    ));

我在表单中附加了一个输入过滤器,用于验证表单中的其他元素(姓名、电子邮件、消息)。当它附加到表单时,验证码字段的验证在检查是否有效时会被忽略。

if ($request->isPost()) {          
        // set the filter
        $form->setInputFilter($form->getInputFilter());
        $form->setData($request->getPost());
        if ($form->isValid()) { ...

如果我删除输入过滤器,则验证码字段正确,但显然其他字段没有验证器。我犯了什么愚蠢的错误?我必须在输入过滤器中设置“验证码”验证器吗?

【问题讨论】:

    标签: php validation zend-framework2 captcha input-filter


    【解决方案1】:

    问题是因为,我假设您在表单上创建了一个名为:

    getInputFilter();

    覆盖原来的getInputFilter(),

    有两种解决方案:

    将表单上的函数重命名为 getInputFilterCustom()

    然后也修改:

    if ($request->isPost()) {          
        // set the filter
        $form->setInputFilter($form->getInputFilterCustom());
    

    或在您当前的 getInputFilter() 中添加验证验证码的逻辑。

    【讨论】:

      【解决方案2】:

      这是我在 ZF2 表单中添加验证码图像控件的代码:

              $this->add(array(
                      'name' => 'captcha',
                      'type' => 'Captcha',
                      'attributes' => array(
                              'id'    => 'captcha',
                              'autocomplete' => 'off',
                              'required'     => 'required'
                      ),
                      'options'    => array(
                              'label' => 'Captcha :',
                              'captcha' => new \Zend\Captcha\Image(array(
                                  'font' => 'public/fonts/arial.ttf',
                                  'imgDir' => 'public/img/captcha',
                                  'imgUrl' => 'img/captcha'               
                              ))
                      ),
              ));
      

      其他表单元素正在使用来自输入过滤器的验证器,但我没有使用任何验证器来使其工作。

      我希望这可以帮助你。

      【讨论】:

      • 感谢您的回复。我尝试了代码,但没有任何区别。另外请注意,如果我在输入过滤器中将验证码字段设置为必填项,也会被忽略。
      【解决方案3】:

      这是因为您没有在您的内部调用父 getInputFilter()。干脆做

      public function getInputFilter()
      {
          parent::getInputFilter();
      
          //... your filters here
      }
      

      【讨论】: