2

Zend 递归地对 Zend_Filter_Input 执行验证,所以代码:

    $data = array(
        'update' => array(1, 2, 3)
    );

    $validators = array(
        'update' => array(
            new Zend_Validate_Callback('is_array'),
            'presence' => 'required'
        )
    );

    $filter = new Zend_Filter_Input(array(), $validators, $data);
    var_dump($filter->isValid());
    var_dump($filter->getMessages());

返回false和消息 1、2 和 3 不是有效值。

有什么方法可以验证一个值是否是数组,而不应用递归规则?

4

1 回答 1

1

正如@zerkms 所说:

Zend_Filter_Input 执行递归遍历,因此特定的验证器与它无关。

为了解决这个问题,我使用了“durty”方式:

$input = new Zend_Filter_Input(
    array(
        'the_field_should_be_array'=> array(
             new MyPersonalValidator($this->_request->getParam('the_field_should_be_array')),
         )
    )
);


 class MyPersonalValidator extends Zend_Validate_Abstract{

    private $_paramIsValid;

public function __construct($param)
{
    $this->_paramIsValid = is_array($param);
}

public function isValid($not_usefull)
{
    if(!$this->_paramIsValid)
    {
        return false;
    }

    return true;
}}

代码说明:我在验证器的构造函数中执行字段的验证。为此,需要将字段传递给构造函数,这不是一个好的做法,但我没有找到另一种方法。

编辑:干净的方法是扩展 Zend_Filter_Input 以支持上下文。我从来没有新的为什么它以前没有实施过。

于 2013-06-13T12:32:39.823 回答