13

Zend Framework 2 ValidatorChain を介して空の値をカスタム バリデータに渡すにはどうすればよいですか?

ZF1で可能だったallowEmpty(false)

空の要素値を持つ ZF2 の場合:

  • の場合allowEmpty = false、 NotEmptyValidator が ValidatorChain の先頭に追加されbreakOnFailure = trueます@see Zend/InputFilter/Input#injectNotEmptyValidator

  • allowEmpty = true、要素が有効と見なされる場合、@see Zend/InputFilter/BaseInputFilter#isValid

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

5 に答える 5

26

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;
    }

    // ...
}
于 2014-07-08T12:55:06.457 に答える
14

ZF2バージョン2.1.1では次のように動作します。

問題は(正しく取得した場合)、次の例では'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バリデーターを自分でアタッチし、とへの呼び出しを回避することsetRequiredですsetAllowEmpty。これは基本的に、バリデーターをそれ自体でZend\InputFilter\Input#injectNotEmptyValidator自動的にアタッチしないように指示します。NotEmpty

$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() {}
}
于 2013-02-16T21:47:16.017 に答える
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し、その後に続くバリデータによる評価を許可します。

于 2014-11-07T18:43:10.393 に答える
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 => falseとを使用して入力フィルター ファクトリに配列を渡すことができallowEmpty => trueます (入力フィルターにも直接渡すことができることを覚えているので、よくわかりません)。

于 2014-02-26T09:35:58.090 に答える
2

allowEmptyinputFilter 構成配列を使用して間違いを犯している人々をよく見かけます。文字列はキャメルケースではなく、アンダースコアで区切って書く必要があります。だからallow_emptyうまくいく:

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

つまり、キー「fieldName」を持つフィールドがデータに存在する必要がありますが、その値は空にすることができます。

于 2015-02-11T11:11:06.760 に答える