2012-11-28 37 views
2

我正在使用Zend_Filter_Input來過濾和驗證我的數據。對於一個場(性別),我現在用的是Zend_Validate_InArray來驗證,如果該值是Zend_Filter_Input Zend_Validate_InArray-Validator其中有一個數組作爲它的針

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(); 

一切工作正常( - 陣列( '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 thas尚未被修復。當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是否爲空數組。

+0

嘿,謝謝你的答案;-)在我的unitTest中,我剛剛刪除了這個empty-Array-Test,認爲沒有開發者會交出一個空數組;;) – Tom

相關問題