在 Zend Framework 2 Forms 中跳过验证器

Skip validators in Zend Framework 2 Forms

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

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

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

例如,您可以扩展 InputFilter class 并在自定义 setData 方法中使用 setValidationGroup,并根据特定对象的存在设置组$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);
    }
}

扩展 class 只是展示可能性的一种选择。您当然也可以在外部其他地方 setValidationGroup 而无需自定义 InputFilter class.

$group = array(
    // your custom validation group
);
$inputFilter->setValidationGroup($group);

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

例如:

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()
    {}
}