2

我正在使用 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() 是 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 时,一个空数组是一个有效值。希望您能够帮助我。

4

1 回答 1

1

这实际上是Zend 框架中的一个错误,目前尚未修复。由于Zend_Filter_InputZend Framework 2 已经停止使用,我非常怀疑它是否会停止。但是,票证上附带了一个补丁程序,可以解决此问题。

我还做了一些调试,可以追踪到_validateRuleZend_Filter_Input的方法:

在那里你可以找到这个代码块:

if (!is_array($field)) {
    $field = array($field);
}
[...]
foreach ($field as $key => $value) {
[...]
    if (!$validatorChain->isValid($value)) {

$field包含字段的值。可以看到,如果传入一个非数组的值,它会被放入一个数组中,这样就进入了foreach块。但是,如果您传递一个空数组,$field则将保留,因此不会输入array(0) {}整个块。foreach因此不会执行单个验证(也不会执行非空检查)。

我也试图找到一种解决方法,但它们都相当尴尬。因此,最简单的解决方法是检查是否$value为空数组。

于 2013-01-20T16:36:39.403 回答