ZF2 表单验证来自选择的值,即使发送了无效值
Posted
技术标签:
【中文标题】ZF2 表单验证来自选择的值,即使发送了无效值【英文标题】:ZF2 form validating value from select even when invalid values sent 【发布时间】:2014-04-26 14:30:09 【问题描述】:我的 ZF2 应用程序中有一个带有选择元素的表单。在 ZF1 中,它会自动添加一个验证器来检查用户是否试图向其发布无效值。
因此,只是为了好玩和咯咯笑,我决定看看如果我使用 Firebug 更改其中一个选项的值然后提交它会发生什么。结果:它以优异的成绩通过了。不用说,这不好。
这里是选择选项的相关代码:
$this->add(array (
'name' => 'role',
'type' => 'Select',
'attributes' => array (
'id' => 'role'
),
'options' => array (
'label' => 'Role:',
'value_options' => $roleOptions,
'column-size' => 'sm-6',
'label_attributes' => array('class' => 'col-sm-2'),
)
));
(注意:$roleOptions 作为参数传入表单)
这是验证器代码的相关部分:
$inputFilter->add($factory->createInput(array (
'name' => 'role',
'filters' => array(),
'validators' => array(
$notEmpty
),
)));
(显然,$notEmpty 是 NotEmpty 验证器的一个实例)
这里发生了什么? ZF2 是否不再添加验证器来确保它收到的值是最初是选项列表的一部分?我现在必须手动添加验证器来选择选项吗?
编辑:我检查了文档,它说选择元素会自动添加一个数组验证器。它应该可以工作,但事实并非如此。我什至尝试在服务器端更改值,结果相同——验证器没有获取无效值。
是的,我正在检查表单是否有效。
编辑 #2:为清楚起见,here's the code for the form in its entirety
【问题讨论】:
另一件事:似乎在角色元素上设置输入过滤器的行为删除了内置的 InArray 验证器。不幸的是,删除它也会造成混乱——为了让 $form->bind() 方法正常工作,每个元素都必须有一个输入过滤器集。那我该怎么办? 【参考方案1】:我通过将选择选项的值设置为数字克服了这个问题:
在表单构造函数中:
// Gender field
$this->add
(
array
(
'type' => 'Zend\Form\Element\Select',
'name' => 'gender',
'attributes' => array
(
'id' => 'GenderField',
'class' => 'form-control',
),
'options' => array
(
'label' => 'Gender',
'empty_option' => 'Please choose...',
'value_options' => array
(
'1' => 'Female',
'2' => 'Male',
'3' => 'Other',
),
)
)
);
然后在我的 InputFilter 中,我将 Between 验证器添加到我的 NotEmpty 验证器中,如下所示:
'validators' => array
(
array(...NotEmpty Validator...),
array
(
'name' => 'Between',
'options' => array
(
'min' => 1,
'max' => 3,
'messages' => array
(...)
),
'break_chain_on_failure' => true,
),
)
由于整个 0|NULL|'' 问题,我也在这里实际上有一个空选项的好习惯:
'empty_option' => 'Please choose...',
还有一个InArray Validator,它对非连续单位同样有用……比如id:
$validator = new Zend\Validator\InArray(array('haystack' => array('value1', 'value2',...'valueN')));
if ($validator->isValid('value'))
// value found
else
// no value found
【讨论】:
这一切都很好,但是根据文档,Zend\Form\Element\Select 类会自动添加一个 InArray 验证器。以上是关于ZF2 表单验证来自选择的值,即使发送了无效值的主要内容,如果未能解决你的问题,请参考以下文章