2012-11-17 6 views
6

私はZend Framework 2を使ってアプリケーションを作成しています。私は入力をInputFilterで検証しています。条件付きで必要なものを作ることは可能ですか?InputZend Frameworkの2 InputFilterで条件付きで必要です

$filter = new \Zend\InputFilter\InputFilter(); 
$factory = new \Zend\InputFilter\Factory(); 
$filter->add($factory->createInput(array(
    'name' => 'type', 
    'required' => true 
))); 
$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => true 
))); 

私はtypeが等しい1されている場合にのみ、フィールドsomethingは、必要になることがしたい:私はそのようなコードを持っている意味します。それを行うための組み込みの方法はありますか?または、カスタムバリデータを作成するだけですか?

答えて

8

まず、あなたはEmpty values passed to Zend framework 2 validators

のように空/ null値の検証を有効にすることができます次の例のように、コールバック入力フィルタを使用することができます。

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) use ($type) { 
     return $value || (1 != $type->getValue()); 
    })); 

$filter->add($type); 
$filter->add($smth); 

これは基本的に動作する値smthが空の文字列aがあるときnd typeの値は1ではありません。 typeの値が1の場合、smthは空の文字列と異なる必要があります。

+0

PHPがインターフェイスをチェックする方法が非常に緩いので、 'isValid($ value、array $ context = [])'メソッドでバリデータを定義することも可能です。そうすれば、文脈で検証を有効/無効にするために '$ context'を使うことができます。 – Ocramius

-3

残念ながら、あなたがそうのようなあなたの条件に基づいて必要なオプションを設定する必要があると思います:すべての

$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => (isset($_POST['type']) && $_POST['type'] == '1'), 
))); 
+4

これは間違っています。ここで、フィルタリングする必要があるリクエストに基づいてフィルタに関する値を設定します。概念的には間違っています。 – Ocramius

1

$ type-> getValueが常にNULLだったので、私はOcramiusの例をうまく理解できませんでした。 $ contextを使うためにコードを少し変更しましたが、これは私のためのトリックでした:

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value, $context){ 
     return $value || (1 != $context['type']); 
    })); 

$filter->add($type); 
$filter->add($smth); 
関連する問題