Zend framework2 如何在Zend Framework 2中从表单元素/表单元素验证器链中删除验证器?

Zend framework2 如何在Zend Framework 2中从表单元素/表单元素验证器链中删除验证器?,zend-framework2,validation,zend-form-element,zend-validate,Zend Framework2,Validation,Zend Form Element,Zend Validate,我在SO上阅读了这个问题:“并试图找到它,但找不到任何方法来分离/删除inaray验证程序。但是,InArray只是一个验证器。那么,如何从表单元素的验证器列表中删除验证器呢 我可以得到验证器: $myElement = $form->getInputFilter()->get('city'); $validatorChain = $cityElement->getValidatorChain(); $validators = $validatorChain->getVa

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

我可以得到验证器:

$myElement = $form->getInputFilter()->get('city');
$validatorChain = $cityElement->getValidatorChain();
$validators = $validatorChain->getValidators();
然后可能可以用验证器取消设置数组元素,我想删除,然后将结果数组传递回输入对象和表单元素。但是它真的很脏,肯定不是推荐的方式


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

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

$myElement = $form->getInputFilter()->get('city');
$validatorChain = $cityElement->getValidatorChain();
$validators = $validatorChain->getValidators();
  • Zend\Validator\NotEmpty
  • Zend\Validator\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);

容易;)

我发现它适用于1.12.3

在我的更新表中

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


My_Form_Element_Username只是扩展了一些Zend_Form_元素并定义了验证器。

您是否尝试过$inputFilter=new inputFilter()$输入过滤器->删除($name);您是否使用$factory=newInputFactory();例如?谢谢!是的,它可以工作:
$formInputFilter=$form->getInputFilter()$formInputFilter->remove('city')$formInputFilter->add((new Zend\InputFilter\Factory())->createInput(数组('name'=>'city','required'=>true,))但是我必须在视图脚本中创建一个
输入。脏的。在您的视图中,只需执行$newInputFilter=newInputFilter();/。。你的东西$inputFilter=新的inputFilter()$inputFilter->add($newInputFilter,“yourElement”)$表单->设置inputFilter($inputFilter);但在你的控制器里会更好!是的,唯一干净的(-er)方法似乎是扩展
InputFilter
,和/或
Input
类,还可能扩展
元素。请看,让我试试,如果这样做有效,将非常有帮助,因为目前“禁用inarray\u验证器”只是禁用错误消息,没有其他w.r.t验证。谢谢您的努力,mate它暂时起作用,但在我创建了新的验证程序链之后,我后来像这样检查了它:print\r($Form->getInputFilter()->get('account')->getValidatorChain()->getValidators());。最后得到的是一个空数组();现在我想知道这个算法是否会删除链中的所有验证器。这是验证器链的转储。Zend\Validator\ValidatorChain对象([plugins:protected]=>[validators:protected]=>Array()[messages:protected]=>Array())从Zend 2.1开始(我相信)addValidator()已被弃用,应该改用attach()。把这个留着以后参考。