我正在使用Zend_Filter_Input来过滤和验证我的数据。对于字段(性别),我使用Zend_Validate_InArray验证,如果值在
array('m', 'w');
到目前为止一切顺利 在运行我的UnitTests时,我注意到,空数组也是性别的有效值 为了分析这个,我写了下面的代码:
$genderArray = array('m', 'w');
$needle = array();
if(in_array($needle, $genderArray)) {
Zend_Debug::dump('is in array');
} else {
Zend_Debug::dump('is not in array');
}
$validator = new Tueks_Validate_InArray($genderArray);
if ($validator->isValid($needle)) {
Zend_Debug::dump('is in array');
} else {
Zend_Debug::dump('is not in array');
}
两次,我都得到'不在阵列'。
但是当我使用以下代码时:
$child = new Tueks_Placereport_Child();
$child->setGender($needle);
$child->validate();
一切正常( - > array()是数组的一部分('m','w'))?!?
以下是我的验证方法的相关部分:
$genderArray = array('m', 'w');
$filters = array();
$validators = array('gender'=>
array('presence'=> 'required',
new Tueks_Validate_InArray($genderArray)
)
);
$input = new Zend_Filter_Input($filters, $validators, $this->_data);
Tueks_Validate_InArray与Zend_Validate_InArray相同,但与其他消息相同。 我没有看到问题,为什么,当使用Zend_Filter_Input时,空数组是有效值。 希望你能帮帮我。
答案 0 :(得分:1)
这实际上是Zend Framework中的a bug尚未修复。由于Zend_Filter_Input
已经停止使用Zend Framework 2,我将高度怀疑它是否永远存在。但是,故障单附加了一个补丁,可以解决此问题。
我也进行了一些调试,可以跟踪Zend_Filter_Input中的方法_validateRule
:
在那里你可以找到这个代码块:
if (!is_array($field)) {
$field = array($field);
}
[...]
foreach ($field as $key => $value) {
[...]
if (!$validatorChain->isValid($value)) {
$field
包含字段的值。如您所见,如果传递非数组值,则将其放入数组中,以便输入foreach块。但是,如果您传递一个空数组,则$field
将保留array(0) {}
,因此不会输入整个foreach
数据块。因此,不会进行单一验证(也不是非空检查)。
我也试图找到一种解决方法,但它们都很尴尬。因此,最简单的解决方法是检查$value
是否为空数组。