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

false1、2、および 3 が有効な値ではないというメッセージが返されます。

再帰ルールを適用せずに、値が配列かどうかを検証する方法はありますか?

4

1 に答える 1

1

@zerkmsが言ったように:

Zend_Filter_Input は再帰的なトラバースを実行するため、特定のバリデータはそれを処理できません。

この問題を解決するために、私は「汚い」方法を使用しています:

$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 に答える