Zend framework 2 как использовать цепочки валидаторов в наборах полей

Мне нужно использовать цепочки валидаторов в методе getInputFilterSpecification набора полей, чтобы использовать параметр breakChainOnFailure и получить только одно сообщение об ошибке.

Я знаю, как создавать цепочки валидаторов с использованием классов InputFilter, как объяснить документация Zend, например

    $input = new Input('foo');
    $input->getFilterChain()
          ->attachByName('stringtrim', true)  //here there is a breakChainOnFailure
          ->attachByName('alpha');

Но я хочу сделать то же самое, используя заводской формат. Где я могу поместить параметр breakChainOnFailure в этом примере:

    $factory = new Factory();
    $inputFilter = $factory->createInputFilter(array(
        'password' => array(
            'name'       => 'password',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'not_empty',
                ),
                array(
                    'name' => 'string_length',
                ),
            ),
        ),
    ));

person josepmra    schedule 01.05.2013    source источник


Ответы (2)


Чтобы ответить на ваш вопрос, нам нужно заглянуть в InputFilter Factory, там мы находим populateValidators метод. Как видите, для валидаторов он ищет ключ break_chain_on_failure в спецификации. Вам просто нужно добавить это в свой массив спецификаций валидатора...

$factory = new Factory();
$inputFilter = $factory->createInputFilter(array(
    'password' => array(
        'name'       => 'password',
        'required'   => true,
        'validators' => array(
            array(
                'name' => 'not_empty',
                'break_chain_on_failure' => true,
            ),
            array(
                'name' => 'string_length',
            ),
        ),
    ),
));

Кстати, сигнатуры метода attachByName для FilterChain (здесь ) и ValidatorChain (здесь) не совпадают. В вашем первом примере вы вызываете метод в цепочке фильтров, которая вообще не поддерживает прерывание при сбое. (вы также можете заметить, что это третий параметр метода цепочки валидатора, а не второй)

person Crisp    schedule 01.05.2013
comment
Большое спасибо за помощь. Вы правы, мой пример метода attachByName был изменен, чтобы сделать пример. Я думал, тот же случай. - person josepmra; 01.05.2013

При просмотре моего кода мне нужно было бы использовать параметр break_chain_on_failure в спецификации цепочки проверки с использованием экземпляров классов проверки (не заводских спецификаций).

пример просмотра:

    'password' = array(
        'required' => true,
        'validators' => array(
            new NotEmpty(),  //these are validator instace classes
            new HostName(),  //and them may be declared before
        ),
    );
person josepmra    schedule 01.05.2013