Валидаторы файлов ZF2 возвращают все сообщения, но их нужно только вызвать

Я хочу получать только инициированные сообщения, но я получаю все зарегистрированные сообщения.

$inputFilter = $factory->createInput(array(
        'name'       => 'image',
        'required'   => true,
        'validators' => array(
            array(
                'name'    => '\Zend\Validator\File\IsImage',
                'options' => ['message' => 'File has to be valid image.']
            ),
            array(
                'name'    => '\Zend\Validator\File\Extension',
                'options' => ['extension' => 'png,jpg,jpeg', 'message' => 'Image extension has to be png,jpg or jpeg.'],
            ),
            array(
                'name'    => '\Zend\Validator\File\Size',
                'options' => ['max' => '2MB', 'message' => 'Maximum file size for image is 2MB.'],
            ),
        ),
    ));

позже в контроллере:

if(!$filter->isValid()){
    var_dump($filter->getMessages());
}

Если я пытаюсь загрузить изображение размером 5 МБ, я получаю все сообщения:

array(
  'image' => array(
    'fileIsImageNotReadable' => 'File has to be valid image'
    'fileExtensionNotFound' => 'Image extension has to be png,jpg or jpeg'
    'fileSizeNotFound' => 'Maximum file size for image is 2MB'  
  )
);

Но ожидайте только "Максимальный размер файла для изображения составляет 2 МБ".

Есть ли способ вернуть только запущенные сообщения? Должно ли это быть поведением по умолчанию метода getMessages()?

1 ответ

Решение

Возможным решением для этого является использование цепочек валидаторов.

В некоторых случаях имеет смысл, чтобы валидатор разрывал цепочку, если его процесс валидации не удался. Zend\Validator\ValidatorChain поддерживает такие случаи использования со вторым параметром attach() метод. Установив $breakChainOnFailure в TRUEдобавленный валидатор прервет выполнение цепочки при сбое, что позволит избежать запуска любых других валидаций, которые определены как ненужные или неподходящие для ситуации.

Таким образом, проверка останавливается при первом сбое, и у вас будет только сообщение о том, что проверка не пройдена. Вы также можете установить приоритеты, чтобы ваши валидаторы применялись в определенном порядке. Этот пример, приведенный в документации, использует метод attach, Это не то, что вам нужно точно.

В вашем случае вы можете просто использовать break_chain_on_failure введите спецификацию вашего валидатора со значением true. Что-то вроде этого:

$inputFilter = $factory->createInput(array(
        'name'       => 'image',
        'required'   => true,
        'validators' => array(
            array(
                'name'    => '\Zend\Validator\File\IsImage',
                'options' => ['message' => 'File has to be valid image.']
                'break_chain_on_failure' => true,
            ),
        ),
));
Другие вопросы по тегам