Как вы, возможно, помните, фильтры и валидаторы, присоединенные к модели формы, как правило,
хранятся в контейнере InputFilter
, который состоит из входов (вход обычно представляет собой
класс Input
, принадлежащий пространству имен `Zend\InputFilter). Для обычных полей формы фильтры
выполняются перед валидаторами, а валидаторы - после фильтров.
Однако, у выгрузки файлов на сервер есть несколько важных отличий:
Input
используется
специальный класс FileInput
;Для хранения правил валидации для выгружаемых на сервер файлов, вместо обычного класса Input
нужно использовать класс FileInput`.
В private-методе модели формы addInputFilter()
добавьте правила валидации файлового входа следующим образом:
$inputFilter->add([
'type' => 'Zend\InputFilter\FileInput',
'name' => 'file', // Имя элемента.
'required' => true, // Является ли поле обязательным.
'filters' => [ // Фильтры.
// Поместите сюда информацию о фильтрах.
],
'validators' => [ // Валидаторы.
// Поместите сюда информацию о валидаторах.
]
]);
В этом фрагменте мы задаем ключ "type" (строка 2) со значением Zend\InputFilter\FileInput
. Остальные
ключи аналогичны тем, что мы использовали до этого при добавлении правил валидации к модели формы.
Поведение класса FileInput
отличается от Input
в следующих аспектах:
Он ожидает данные, которые вы передаете в качестве входа, в формате массива $_FILES
(запись массива
с ключами tmp_name
, error
, type
).
Валидатор Zend\Validator\File\Upload
автоматически добавляется в начало цепи валидаторов входных данных
перед всеми остальными валидаторами.
Валидаторы, добавленные в цепочку валидаторов входа, выполняются перед фильтрами, добавленными
в цепочку фильтров. Это противоположно поведению класса Input
.
Для обычных полей формы фильтры, как правило, выполняются перед валидаторами, а валидаторы - после фильтров. Однако, при выгрузке файлов на сервер последовательность обратная.
При выгрузке файлов на сервер валидаторы выполняются перед фильтрами. Это поведение противоположно обычному.
При работе с выгруженными на сервер файлами, сперва нужно проверить, что данные, извлеченные
из суперглобального массива $_FILES
корректны, и только затем делать с ними что угодно (перемещать
в каталог хранилища, переименовывать и т.д.). По этой причине валидаторы файлов должны запускаться
в первую очередь, а фильтры - в последнюю.
Рассмотрим, как это выполняется, вспомнив типичный рабочий процесс для формы:
isValid()
для выполнения фильтров и валидаторов в присоединенном к форме фильтре входных данных.getData()
для извлечения отфильтрованных и валидированных данных из фильтра
входных данных, присоединенного к форме.getMessages()
для извлечения сообщений об ошибках.Рабочий процесс при использовании FileInput
такой же, однако важно понимать, что происходит
на каждом его этапе:
isValid()
, чтобы выполнить валидаторы в присоединенном к форме фильтре входных данных.getData()
, чтобы выполнить фильтры и извлечь отфильтрованные
и валидированные данные из фильтра входных данных, присоединенного к форме.getMessages()
для извлечения сообщений об ошибках.Обратите внимание на то, что для
FileInput
добавленные фильтры запускаются только если вызван методgetData()
.
При использовании и входов Input
, и FileInput
в фильтре входных данных формы (что является довольно распространенным случаем),
фильтры все равно выполняются первыми для обычных входов, однако для файловых входов первыми выполняются валидаторы.