2013-02-16 20 views
13

Zend framework 2 ValidatorChainから空の値をカスタムバリデータに渡すにはどうすればよいですか?空の値がZend Framework 2のバリデータに渡されます

が空要素の値とZF2にallowEmpty(false)

によってZF1に可能であった:allowEmpty = false場合

  • 、NotEmptyValidatorはbreakOnFailure = true@see Zend/InputFilter/Input#injectNotEmptyValidatorとValidatorChainの先頭に追加されます。

  • allowEmpty = true場合、要素はZF2バージョン2.1.1のための作品に続いて有効な、@see Zend/InputFilter/BaseInputFilter#isValid

    if ($input->allowEmpty()) { 
        $this->validInputs[$name] = $input; 
        continue; 
    } 
    
+1

http://akrabat.com/zend-framework-2/setting-up-required-fields-that-c​​an-be-empty-with-zendinputfilter/ – Sam

+0

allow_empty = trueとmy要素の値が空の場合、zf2はその要素が有効であるとみなし、バリデーターを起動しません。 – deyine

+0

私はあなたの問題を理解していないと思います。空の値を許可するかしないかを指定します。空の値を許可しないと、すべてのバリデータが実行されます。空の値が入力されると、検証は失敗します。あなたがそれらを許可すれば、空の値はそれ以上検証される必要はありませんoO – Sam

答えて

14

と考えられている:

問題は(私が正しくそれを得た場合)であることです次の例では、空値が'fieldName'の場合、検証はトリガーされません。

$input = new \Zend\InputFilter\Input('fieldName'); 

$input 
    ->setAllowEmpty(true) 
    ->setRequired(false) 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\Callback(function ($value) { 
     echo 'called validator!'; 

     return true; // valid 
    })); 

$inputFilter = new \Zend\InputFilter\InputFilter(); 
$inputFilter->add($input); 

$inputFilter->setData(array('fieldName' => 'value')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array('fieldName' => '')); 
var_dump($inputFilter->isValid()); // true, no output 

$inputFilter->setData(array()); 
var_dump($inputFilter->isValid()); // true, no output 

にこれがあなたのCMS内のページに割り当てられたURLをチェックし、衝突を回避のようなあなたは、特定のケースを持っていたときに非常に迷惑ですが、これは、非常にいらいらすることができます(空のURLはまだURLです!) 。

基本的にNotEmptyバリデーターを自分で添付し、setRequiredsetAllowEmptyへの呼び出しを避けるために、これを空の文字列に対して処理する方法があります。これは基本的にutomatically独自にNotEmptyバリデータを添付しないZend\InputFilter\Input#injectNotEmptyValidatorを教えてくれます:

$input = new \Zend\InputFilter\Input('fieldName'); 

$input 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) { 
     echo 'called validator!'; 

     return true; // valid 
    })); 

$inputFilter = new \Zend\InputFilter\InputFilter(); 
$inputFilter->add($input); 

$inputFilter->setData(array('fieldName' => 'value')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array('fieldName' => '')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array()); 
var_dump($inputFilter->isValid()); // false (null was passed to the validator) 

あなたもnullに対してチェックしたい場合は、以下のようZend\InputFilter\Inputを拡張する必要があります:あなたの場合

class MyInput extends \Zend\InputFilter\Input 
{ 
    // disabling auto-injection of the `NotEmpty` validator 
    protected function injectNotEmptyValidator() {} 
} 
+0

あなたはそれを行った、私はnullと空にチェックしたい、最後のソリューションは私の実装を確認します。どうもありがとう。 – deyine

+5

_Zend \ InputFilter \ Input_を拡張するのではなく、 '$ input-> setContinueIfEmpty(true);'を実行するだけで、同じ効果が得られます。 –

2

検証のために別のフォーム検証クラスまたは配列表記を使用する場合は、次のようにします。

$factory  = new Zend\InputFilter\Factory(); 
$inputFilter = new Zend\InputFilter\InputFilter(); 

$inputFilter->add($factory->createInput(array(
    'name' => 'name', 
    'required' => false, 
    'allowEmpty' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim'), 
    ), 
    'validators' => array(
     array(
      'name' => 'StringLength', 
      'options' => array(
       'encoding' => 'UTF-8', 
       'min' => '8', 
       'max' => '100', 
      ), 
     ), 
    ), 
))); 

required => falseallowEmpty => trueの配列を入力フィルタのファクトリに渡すことができます(入力フィルタに直接渡すことができますので、あまりよくありません)。

25

continue_if_empty解決しました。 @ dson-horácio-Juniorに感謝します。これは私が使用したものである:

$this->add(array(
    'name' => 'field', 
    'continue_if_empty' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim') 
    ), 
    'validators' => array(
     array(
      'name' => 'Application\Form\Validator\Sample' 
     ) 
    ) 
)); 

public function isValid($value, $context = null) 
{ 
    if ($value == '' && $context['otherfield'] == '') { 
     $this->error(self::INVALID_FIELD); 

     return false; 
    } 

    // ... 
} 
+0

完璧な答え。ありがとう – Abadis

+0

ベスト・アンサー!より多くのupvotesに値する。 'continue_if_empty'を' true'に設定した場合、 'InputFilter \ Factory'は' NotEmpty'バリデーターを自動的に追加しないので、すべてのバリデーションはユーザー定義バリデーターに行きます。 – kachar

+0

すてきな回答ありがとう+1 –

7

これは、値が空の文字列だった私のCallbackバリデータの検証をトリガー:

'required'   => false, 
'allow_empty'  => false, 
'continue_if_empty' => true, 
'validators'  => array(
    array(
     'name' => 'Callback', 
     'options' => array(
      'callback' => function ($value, $context = []) use ($self) { 
       // ... 
      } 
     ) 
    ) 
) 

allow_emptyは、最初は空の文字列を無効にし、continue_if_emptyは、それが、その後にすることができますそれに続くバリデータによって評価されます。

+0

これは解決策です、ありがとうBen –

+0

保存私の一日!ありがとう –

2

inputfilter config配列にallowEmptyを使用して間違っていることがよくあります。文字列は、ラクダケースではなく、アンダースコアで区切って記述する必要があります。だから、allow_emptyは動作します:

'fieldName' => array(
    'name'  => 'fieldName', 
    'required' => true, 
    'allow_empty' => true, 
    'filters' => array(
     //... your filters ... 
    ) 
    'validators' => array(
     //... your validators ... 
    ), 
); 

をキーでフィールドを意味する「フィールド名」データ内に存在しなければならないが、その値が空であることを許可されています。

関連する問題