В этом разделе мы приведем небольшой пример кода, показывающий, как обрабатывать выгрузку файлов на сервер в методе действия контроллера. Мы привлечем внимание читателя к специфичным для выгрузки файлов аспектам.
Предположим, что мы хотим добавить веб-страницу, отображающую форму (назовем ее YourForm
), которая
умеет выгружать файлы на сервер. Для этого нам нужно добавить в класс контроллера метод uploadAction()
.
<?php
//...
class IndexController extends AbstractActionController
{
// Действие "upload", отображающее страницу Upload.
public function uploadAction()
{
// Создаем модель формы.
$form = new YourForm();
// Проверяем, отправил ли пользователь форму.
if($this->getRequest()->isPost()) {
// Обязательно объедините информацию о файлах!
$request = $this->getRequest();
$data = array_merge_recursive(
$request->getPost()->toArray(),
$request->getFiles()->toArray()
);
// Передаем форме данные.
$form->setData($data);
// Выполняем валидаторы файлов.
if($form->isValid()) {
// Выполняем фильтры файлов.
$data = $form->getData();
// Перенаправляем пользователя на другую страницу.
return $this->redirect()->toRoute('application', ['action'=>'index']);
}
}
// Визуализируем страницу.
return new ViewModel([
'form' => $form
]);
}
}
Как видите из этого фрагмента кода, uploadAction()
выглядит как обычное действие контроллера,
реализующее типичный рабочий процесс формы, однако у него есть несколько специфичных для выгрузки
файлов на сервер аспектов (отмечены жирным шрифтом):
В строке 9 мы создаем экземпляр модели формы YourForm
с помощью оператора new
.
В строке 12 мы проверяем, является ли запрос HTTP-запросом методом POST. Если это так,
мы получаем данные из суперглобальных PHP-массивов $_POST
и $_FILES и объединяем
их в один массив (строки 15-19). Это необходимо для корректной обработки выгруженных на
сервер файлов, если таковые имеются. Затем мы передаем этот массив модели формы с помощью
метода
setData()` (строка 22).
В строке 25 мы вызываем метод модели формы isValid()
. Он запускает фильтр входных
данных, присоединенный к модели формы. Для входов FileInput
этот метод выполнит
только присоединенные валидаторы.
Если данные действительны, мы вызываем метод getData()
(строка 28). Для входов
FileInput
этот запустит присоединенные фильтры. Фильтры файлов могут, к примеру,
перемещать выгруженные на сервер файлы в их постоянный каталог.
В случае успеха мы перенаправляем пользователя к действию контроллера "index" (строка 31).
При работе с этим действием контроллера следует помнить три вещи: 1) объединяйте суперглобальные массивы $_POST
и
$_FILESперед тем, как передать их методу формы
setData(); 2) используйте метод формы
isValid()для проверки выгружаемых файлов на корректность (то есть, запускайте валидаторы); 3) используйте метод формы
getData()` для запуска фильтров файлов.