Zend_Filter_Input与Zend_Validate_InArray-Validator,其数组为针

时间:2012-11-28 12:50:46

标签: php arrays zend-validate zend-filter

我正在使用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时,空数组是有效值。 希望你能帮帮我。

1 个答案:

答案 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是否为空数组。