Zend framework 2/Роутинг и контроллеры
Роутинг и контроллеры
правитьВведение
правитьМы построим простую систему инвентаризации, которая будет показывать информацию о наших альбомах. На главной странице будет выведен список альбомов, а также кнопки добавить, редактировать и удалить альбом.
Перед началом написания кода важно понять, как устроены страницы в фреймворке. Каждая страница приложения(сайта) является «действием»(action), действия группируются в контроллеры(controllers). Которые в свою очередь располагаются в модулях. Например: в контроллере «news» могут быть действия текущая новость(current), архив(archive) и просмотр(view).
Так как у нас будут четыре страницы и все они относятся к альбомам, мы разместим все действия(action) в контроллере AlbumController в модуле Album:
Page | Controller | Action |
---|---|---|
Home | AlbumController | index |
Add new album | AlbumController | add |
Edit album | AlbumController | edit |
Delete album | AlbumController | delete |
Отображение конкретных страниц происходит в зависимости от прописанных путей URL, которые в свою очередь прописаны в конфигурационном файле модуля module.config.php. Измените этот файл, как на примере ниже:
// module/Album/config/module.config.php: return array( 'controllers' => array( 'invokables' => array( 'Album\Controller\Album' => 'Album\Controller\AlbumController', ), ), // The following section is new and should be added to your file 'router' => array( 'routes' => array( 'album' => array( 'type' => 'segment', 'options' => array( 'route' => '/album[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'Album\Controller\Album', 'action' => 'index', ), ), ), ), ), 'view_manager' => array( 'template_path_stack' => array( 'album' => __DIR__ . '/../view', ), ), );
Разберем код. Имя роута(маршрута) «album» с типом данных «segment». Этот тип маршрутизации даёт нам возможность определить «заполнители маршрута»(placeholders) в URL, которые будут показаны/введены в строке адресса браузера. В данном случае это: «/album[/:action][/:id]», которые будут соответствовать любому URL, начинающемуся с /album. Следующий сегмент [/:action] – необязателен и будет указывать на нужное имя действия, [/:id] - тоже необязателен и будет указывать на id нужного альбома для вывода информации о нем. В массиве «constraints» указываем допустимые символы, которые когут быть введены, при указании сегмента. Тоесть «action» может быть только буквами(верхний и нижний регистр английского языка) и цифры от 0 до 9, нижнее подчеркивание и тере. «Id» может быть только цифрами от 0 до 9.
Данные настройки роутинга позволяют нам вводить следующие адреса URL:
URL | Page | Action |
---|---|---|
/album | Home | index |
/album/add | Add new album | add |
/album/edit/2 | Edit album c id = 2 | edit |
/album/delete/4 | Delete album c id = 4 | delete |
Создание контроллера
правитьТеперь приступим к созданию нашего котроллера. В Zend Framework 2 контроллер это класс с именем {Имя контроллера(Controller name)}Controller. Имя контроллера должно начинаться с заглавной буквы. Сам класс расположен в файле {Имя контроллера(Controller name)}Controller.php в директории «Controller» модуля. В нашем случае это module/Album/srs/Album/Controller. Каждый метод(action) представляет собой метод класса с правами доступа «public» и именем {имя метода(action name)}Action. Имя метода должно начинаться с маленькой буквы.
Важно: В Zend Framework 2 есть только два основных ограничения на создание контроллеров. Они должны наследовать интерфейс Zend\Stdlib\Dispatchable. Для этого в фреймворке есть два абстрактных класса: Zend\Mvc\Controller\AbstractActionController и Zend\Mvc\Controller\AbstractRestfullController. Мы будем использовать стандартный класс Zend\Mvc\Controller\AbstractActionController. Но если Вам нужно будет написать веб службу, то придется использовать Zend\Mvc\Controller\AbstractRestfullController.
Создадим наш класс для контроллера:
// module/Album/src/Album/Controller/AlbumController.php: namespace Album\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class AlbumController extends AbstractActionController { public function indexAction() { } public function addAction() { } public function editAction() { } public function deleteAction() { } }
Важно: Мы уже сообщили приложению про наш контроллер в массиве «сontroller» файла module/module.config.php.
Только что мы создали все необходимые 4 действия. Для того, что б они заработали нам еще нужно создать помощники видов(views) для каждого действия соответственно.
URL для каждого действия теперь выглядят так:
URL Название метода(действия)
http://zf2-tutorial.localhost/album Album/Controller/AlbumController::indexAction
http://zf2-tutorial.localhost/album/add Album/Controller/AlbumController::addAction
http://zf2-tutorial.localhost/album/edit Album/Controller/AlbumController::editAction
http://zf2-tutorial.localhost/album/delete Album/Controller/AlbumController::deleteAction
Настало время создать шаблоны видов и шаблоны.
Инициализации скриптов вида
правитьДля интеграции шаблонов в приложение(сайт) нам нужно просто создать файлы со скриптами видов. Эти файлы будут автоматически подключены и выполнен код, а так же результат выполнения кода будет показан в браузере. Так же в шаблоны вида попадают все переменные, которые возвращает(return …) соответствующий метод(действие). Шаблоны вида располагаются в соответственной директории каждого модуля, а имена совпадают с именем действия(action) без приставки «Action».
Создайте 4 пустых файла:
module/Album/view/album/album/index.phtml module/Album/view/album/album/add.phtml module/Album/view/album/album/edit.phtml module/Album/view/album/album/delete.phtml