Валидаторы файлов 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,
),
),
));
1

Другие решения

Других решений пока нет …