Forms 如何使用ZF2中的数组表单设置使字段验证依赖于另一个字段?

Forms 如何使用ZF2中的数组表单设置使字段验证依赖于另一个字段?,forms,validation,zend-framework2,zend-form,zend-form-element,Forms,Validation,Zend Framework2,Zend Form,Zend Form Element,在我的表单中有一个字段foo,它在数据库表中应该是唯一的。因此,我在其验证程序列表中添加了一个Zend\Validator\Db\NoRecordExists: namespace Bar\Form\Fieldset; use Zend\Form\Fieldset; use Zend\InputFilter\InputFilterProviderInterface; use Zend\Db\Adapter\AdapterInterface; class BuzFieldset extends

在我的表单中有一个字段
foo
,它在数据库表中应该是唯一的。因此,我在其验证程序列表中添加了一个
Zend\Validator\Db\NoRecordExists

namespace Bar\Form\Fieldset;

use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Db\Adapter\AdapterInterface;

class BuzFieldset extends Fieldset implements InputFilterProviderInterface
{
    protected $dbAdapter;

    public function __construct($name = null, $options = []) {...}

    public function setDbAdapter(AdapterInterface $dbAdapter) {...}

    public function init()
    {
        $this->add([
            'name' => 'id',
            'type' => 'hidden'
        ]);
        $this->add(
            [
                'name' => 'foo',
                'type' => 'text',
                'options' => [...],
                'attributes' => [
                    'required' => 'required',
                    'class' => 'form-control'
                ]
            ]);
        ...
    }

    public function getInputFilterSpecification()
    {
        return [
            'foo' => [
                'required' => true,
                'validators' => [
                    [
                        'name' => 'Regex',
                        'options' => [
                            'pattern' => '/.../',
                            'message' => _(...)
                        ]
                    ],
                    [
                        'name' => 'Zend\Validator\Db\NoRecordExists',
                        'options' => [
                            'table' => 'buz',
                            'field' => 'foo',
                            'adapter' => $this->dbAdapter
                        ]
                    ]
                ]
            ],
            ...
        ];
    }
}

现在我想使用相同的表单更新条目,当然无法验证表单。因此,我需要根据字段
id
对该字段进行
NoRecordExists
验证。如果设置了
id
(这意味着它正在更新,而不是创建),则应应用所有验证器(例如此处
Regex
),但不应用此验证器。如何做到这一点?

您可以查看验证器。此验证器将允许您访问表单上下文,从而获得其他字段的值。在
回调
验证器中使用
NoRecordExists
验证器使其依赖。像这样的。我没有测试这个,但你会明白的

'foo' => [
    'required' => true,
    'validators' => [
        [
            'name' => 'Callback',
            'options' => [
                'callback' => function($value, $context = []) {
                    if (empty($context['id'])) {
                        return $this->noRecordExistsValidator->isValid($value);
                    }

                    return true;
                },
            ],
        ]
    ]
]

您需要将
NoRecordExistsValidator
作为此表单类的依赖项注入,或者更好地创建一个单独的
InputFilter
和相应的工厂,完全设置
InputFilter
,并将该实例注入
字段集
对象。

您可以查看验证程序。此验证器将允许您访问表单上下文,从而获得其他字段的值。在
回调
验证器中使用
NoRecordExists
验证器使其依赖。像这样的。我没有测试这个,但你会明白的

'foo' => [
    'required' => true,
    'validators' => [
        [
            'name' => 'Callback',
            'options' => [
                'callback' => function($value, $context = []) {
                    if (empty($context['id'])) {
                        return $this->noRecordExistsValidator->isValid($value);
                    }

                    return true;
                },
            ],
        ]
    ]
]
您需要将
NoRecordExistsValidator
作为此表单类的依赖项注入,或者最好创建一个单独的
InputFilter
和相应的工厂,完全设置
InputFilter
并将该实例注入
字段集
对象