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