如何使用Zend验证器验证Zend\Form\Element\MultiCheckbox组件?
验证Zend Form MultiCheckbox的可行方案
当然可以用Zend的验证器来验证Zend\Form\Element\MultiCheckbox实例,不过默认的Zend\Validator\Digits这类验证器确实没考虑选中值为数组的场景,得稍微调整验证逻辑,这里给你几个实用的方案:
方案一:用Zend\Validator\Each验证数组元素(推荐)
如果你的Zend Framework版本是2.3及以上,Zend\Validator\Each是最省心的选择。它能对数组中的每个元素单独应用指定验证器,完美适配MultiCheckbox返回数组的特性。
在表单的input filter配置里可以这么写:
$inputFilter->add([ 'name' => 'your_multicheckbox_name', 'required' => true, 'validators' => [ [ 'name' => 'Each', 'options' => [ 'validator' => [ 'name' => 'Digits', ], ], ], ], ]);
这样就能确保MultiCheckbox选中的每一个值都是纯数字了。
方案二:自定义Callback验证器
如果你的ZF版本不支持Each,或者需要更灵活的验证逻辑,可以用Callback验证器手动遍历数组做校验:
$inputFilter->add([ 'name' => 'your_multicheckbox_name', 'required' => true, 'validators' => [ [ 'name' => 'Callback', 'options' => [ 'callback' => function ($value) { // 处理非数组的极端情况 $values = is_array($value) ? $value : [$value]; $digitsValidator = new \Zend\Validator\Digits(); foreach ($values as $item) { if (!$digitsValidator->isValid($item)) { return false; } } return true; }, 'messages' => [ \Zend\Validator\Callback::INVALID_VALUE => '选中的选项必须都是数字', ], ], ], ], ]);
方案三:扩展Digits验证器支持数组
你也可以自己封装一个支持数组的Digits验证器,继承原类并重写isValid方法:
class ArrayDigitsValidator extends \Zend\Validator\Digits { public function isValid($value) { if (is_array($value)) { foreach ($value as $item) { if (!parent::isValid($item)) { $this->setMessages(parent::getMessages()); return false; } } return true; } return parent::isValid($value); } }
之后在input filter里直接使用这个自定义验证器即可。
另外要注意,配置表单时要保证MultiCheckbox的元素名称和input filter里的name完全对应,这样验证逻辑才能正确触发。
内容的提问来源于stack exchange,提问作者d.lanza38
相关产品推荐
相关产品推荐

