Содержание


Роутинг и контроллеры


Routing and controllers



Введение

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

Перед началом написания кода важно понять, как устроены страницы в фреймоврке. Каждая страница приложения(сайта) является «действием»(action), действия группируются в контроллеры(controllers). Которые в свою очередь располагаются в модулях. Например: в контроллере «news» могут быть действия текущая новость(current), архив(archiv) и просмотр(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  


Автор статьи: DuB