4

我在 SO 上阅读了这个问题:“如何在 zend framework2 中禁用 inArray 验证器表单”并试图找出它,但找不到任何方法来分离/删除InArray验证器。但InArray只是一个验证者。那么如何从表单元素的验证器列表中删除验证器呢?

我可以得到验证器:

$myElement = $form->getInputFilter()->get('city');
$validatorChain = $cityElement->getValidatorChain();
$validators = $validatorChain->getValidators();

然后也许可以使用验证器取消设置数组元素,我想删除,然后将结果数组传递回 Input 对象和表单元素。但它真的很脏,肯定不是推荐的方式。

那么如何从表单元素中删除验证器呢?

4

2 回答 2

6

好吧,你可以用一个新的来替换验证器链。假设我有一个带有两个验证器的元素:

  • Zend\Validator\NotEmpty
  • Zend\Validator\EmailAddress

我想从中删除 EmailAddress 验证器。你可以这样做:

// create new validator chain
$newValidatorChain = new \Zend\Validator\ValidatorChain;
// loop through all validators of the validator chained currently attached to the element
foreach ($form->getInputFilter()->get('myElement')->getValidatorChain()->getValidators() as $validator) {
    // attach validator unless it's instance of Zend\Validator\EmailAddress
    if (!($validator['instance'] instanceof \Zend\Validator\EmailAddress)) {
        $newValidatorChain->addValidator($validator['instance'], $validator['breakChainOnFailure']);
    }
}
// replace the old validator chain on the element
$form->getInputFilter()->get('myElement')->setValidatorChain($newValidatorChain);

简单的 ;)

于 2013-04-30T10:38:28.237 回答
3

我发现这适用于 1.12.3

在我的更新表格中

$element = new My_Form_Element_Username('username');
$element->setValue('some-value');
$element->removeValidator('Db_NoRecordExists');
$this->addElement($element);

或者

$this->addElement(new My_Form_Element_Username('username')
  ->setValue('some-value')
  ->removeValidator('Db_NoRecordExists');

My_Form_Element_Username 只是扩展了一些 Zend_Form_Element 并定义了验证器。

于 2013-11-01T11:54:18.187 回答