A free and open-source book on ZF3 for beginners


10.7. Действие контроллера и выгрузка файлов на сервер

В этом разделе мы приведем небольшой пример кода, показывающий, как обрабатывать выгрузку файлов на сервер в методе действия контроллера. Мы привлечем внимание читателя к специфичным для выгрузки файлов аспектам.

Предположим, что мы хотим добавить веб-страницу, отображающую форму (назовем ее 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() выглядит как обычное действие контроллера, реализующее типичный рабочий процесс формы, однако у него есть несколько специфичных для выгрузки файлов на сервер аспектов (отмечены жирным шрифтом):

При работе с этим действием контроллера следует помнить три вещи: 1) объединяйте суперглобальные массивы $_POST и $_FILES перед тем, как передать их методу формы setData(); 2) используйте метод формы isValid() для проверки выгружаемых файлов на корректность (то есть, запускайте валидаторы); 3) используйте метод формы getData()` для запуска фильтров файлов.


Top