在Zend Framework 2表单中跳过验证器

时间:2015-10-27 16:27:08

标签: php forms validation zend-framework2

我正在使用Zend Framework 2来构建我的项目。在我的一个表单中,我有一个字段,只有在满足给定条件时才需要使用多个验证器进行验证(例如,另一个表单字段的值)。

有没有办法完全跳过基于外部条件的字段验证?

2 个答案:

答案 0 :(得分:1)

您可以使用setValidationGroup类中的方法InputFilter来设置应验证哪些输入字段。

例如,您可以扩展InputFilter类并在自定义setValidationGroup方法中使用setData,并根据{{1}中某个字段的存在来设置该组}。

例如:

$data

扩展课程只是展示可能性的一个选项。当然,您也可以在其他地方外部<?php namespace Application\InputFilter; use Zend\InputFilter\InputFilter; class CustomInputFilter extends InputFilter { /** * Set data to use when validating and filtering * * @param array|Traversable $data * @return InputFilterInterface */ public function setData($data) { $group = array( // your custom validation group ); if(isset($data['fieldName'])){ $this->setValidationGroup($group); } // Forward to default setData method return parent::setData($data); } } 而无需自定义setValidationGroup类。

InputFilter

答案 1 :(得分:0)

您还可以使用$context中的Zend\Validator\ValidatorInterface参数来获取其他表单元素的值。您只需要一个自定义验证器并将其设置在表单元素上。

例如:

use Zend\Validator;
use Zend\Validator\Exception;

class MyCustomValidator implements Validator\ValidatorInterface
{
    public function isValid($value, array $context = [])
    {
        if (! isset($context['name_of_other_field'])) {
            throw new Exception\RuntimeException('name_of_other_field missing.');
        }

        if (1234 === $context['name_of_other_field']) {

            $validator = new Validator\ValidatorChain();

            $validator->attach(new Validator\StringLength(['min' => 8, 'max' => 12]));
            $validator->attach(new Validator\EmailAddress());

            return $validator->isValid($value);
        }

        return true;
    }

    public function getMessages()
    {}
}