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

4
我是一名有用的助手,可以为您翻译文本。
我在SO上读到了这个问题:“如何在Zend Framework2中禁用inArray验证器表单”,并试图找到答案,但无法找到任何方法来分离/删除InArray验证器。但是,InArray只是一个验证器。那么如何从表单元素的验证器列表中删除一个验证器?
我可以获取验证器:
$myElement = $form->getInputFilter()->get('city');
$validatorChain = $cityElement->getValidatorChain();
$validators = $validatorChain->getValidators();

也许可以使用验证器取消设置数组元素,我想要移除它,然后将结果数组传回到Input对象和表单元素。但这样做非常不优雅,肯定不是推荐的方式。

那么如何从表单元素中移除一个验证器?


1
你尝试过这样写吗?$inputFilter = new InputFilter(); $inputFilter->remove($name);另外,你是否使用 $factory = new InputFactory(); 这个例子? - Remi Thomas
谢谢!是的,它可行:$formInputFilter = $form->getInputFilter(); $formInputFilter->remove('city'); $formInputFilter->add((new Zend\InputFilter\Factory())->createInput(array( 'name' => 'city', 'required' => true, )));但接下来我需要在视图脚本中创建一个 Input。这样不太好。 - automatix
我同意你的观点。也许你可以在你的inputFilter(在构造函数中)中添加一些条件,以处理一些添加或删除操作来过滤你的数据。像这样 class YourInputFilter extends InputFilter {public function __construct($cityRequired = false) { //... blabla $formInputFilter->add((new Zend\InputFilter\Factory())->createInput(array( 'name' => 'city', 'required' => $cityRequired, ))); // 或者 if($cityRequired){ // 这个验证器}else{ // 另一个验证器 } } } - Remi Thomas
1
是的,唯一比较干净的方式似乎是扩展“InputFilter”、“Input”类,以及可能还有“Element”。 - automatix
1
请参见https://dev59.com/i3DYa4cB1Zd3GeqPAXTH。 - Sam
显示剩余3条评论
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);

很简单 ;)


让我试试,如果这行得通的话,它将是一个巨大的帮助,因为目前 "disable_inarray_validator" 只是禁用了错误消息,而与验证方面的其他内容无关。 - noobie-php
谢谢你的努力,伙计。它暂时起作用了,但是在我创建新的验证器链之后,我稍后像这样检查它:print_r($Form->getInputFilter()->get('account')->getValidatorChain()->getValidators());。最终得到的是一个空数组(); 现在我想知道这个算法是否会删除链中的所有验证器。 - noobie-php
这是ValidatorChain的转储。 Zend\Validator\ValidatorChain对象([plugins:protected] => [validators:protected] => Array()[messages:protected] => Array()) - noobie-php
从Zend 2.1开始(我相信),addValidator()已被弃用,应改用attach()。将此留在此处供将来参考。 - Adrian

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,并且已经定义了验证器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接