A free and open-source book on ZF3 for beginners


10.6. Контейнер InputFilter и выгрузка файлов на сервер

Как вы, возможно, помните, фильтры и валидаторы, присоединенные к модели формы, как правило, хранятся в контейнере InputFilter, который состоит из входов (вход обычно представляет собой класс Input, принадлежащий пространству имен `Zend\InputFilter). Для обычных полей формы фильтры выполняются перед валидаторами, а валидаторы - после фильтров.

Однако, у выгрузки файлов на сервер есть несколько важных отличий:

  1. для хранения правил валидации для выгружаемых файлов вместо класса Input используется специальный класс FileInput;
  2. и валидаторы применяются перед фильтрами (!).

10.6.1. FileInput

Для хранения правил валидации для выгружаемых на сервер файлов, вместо обычного класса Input нужно использовать класс FileInput`.

В private-методе модели формы addInputFilter() добавьте правила валидации файлового входа следующим образом:

    $inputFilter->add([
        'type'     => 'Zend\InputFilter\FileInput',
        'name'     => 'file',  // Имя элемента.
        'required' => true,    // Является ли поле обязательным.
        'filters'  => [        // Фильтры.
            // Поместите сюда информацию о фильтрах.   
        ],                
        'validators' => [      // Валидаторы.
            // Поместите сюда информацию о валидаторах.
        ]        
      ]); 

В этом фрагменте мы задаем ключ "type" (строка 2) со значением Zend\InputFilter\FileInput. Остальные ключи аналогичны тем, что мы использовали до этого при добавлении правил валидации к модели формы.

Поведение класса FileInput отличается от Input в следующих аспектах:

  1. Он ожидает данные, которые вы передаете в качестве входа, в формате массива $_FILES (запись массива с ключами tmp_name, error, type).

  2. Валидатор Zend\Validator\File\Upload автоматически добавляется в начало цепи валидаторов входных данных перед всеми остальными валидаторами.

  3. Валидаторы, добавленные в цепочку валидаторов входа, выполняются перед фильтрами, добавленными в цепочку фильтров. Это противоположно поведению класса Input.

10.6.2. Выполнение валидаторов перед фильтрами

Для обычных полей формы фильтры, как правило, выполняются перед валидаторами, а валидаторы - после фильтров. Однако, при выгрузке файлов на сервер последовательность обратная.

При выгрузке файлов на сервер валидаторы выполняются перед фильтрами. Это поведение противоположно обычному.

При работе с выгруженными на сервер файлами, сперва нужно проверить, что данные, извлеченные из суперглобального массива $_FILES корректны, и только затем делать с ними что угодно (перемещать в каталог хранилища, переименовывать и т.д.). По этой причине валидаторы файлов должны запускаться в первую очередь, а фильтры - в последнюю.

Рассмотрим, как это выполняется, вспомнив типичный рабочий процесс для формы:

Рабочий процесс при использовании FileInput такой же, однако важно понимать, что происходит на каждом его этапе:

Обратите внимание на то, что для FileInput добавленные фильтры запускаются только если вызван метод getData().

При использовании и входов Input, и FileInput в фильтре входных данных формы (что является довольно распространенным случаем), фильтры все равно выполняются первыми для обычных входов, однако для файловых входов первыми выполняются валидаторы.


Top