A free and open-source book on ZF3 for beginners


4.11. Плагины контроллера

Плагин контроллера - это класс, который некоторым образом расширяет функциональность всех контроллеров.

Без плагинов, чтобы расширить функциональность всех контроллеров, вам нужно бы было создать базовый класс, скажем, BaseController, и наследовать другие контроллеры от этого базового класса. Так тоже можно делать, но с точки зрения создателей ZF3 плагины - решение лучше, так как они используют композицию классов 2, которая обеспечивает большую гибкость по сравнению с наследованием классов. Вы создаете ваш плагин контроллера, и он автоматически становится доступным изо всех контроллеров вашего приложения (базовый класс AbstractActionController использует магический PHP-метод __call() для передачи вызовов созданным плагинам контроллеров.).

2) Композиция - это взаимосвязь между двумя классами, называемая "has-a" и лучше всего описываемая как отношение "часть - целое". Класс-владелец содержит ссылку на другой класс (плагин). Владелец ответственен за существование объекта, который он содержит.

Существует несколько стандартных плагинов контроллера (см. таблицу 4.6), и мы уже использовали один из них (Params) в одном из предыдущих примеров.

Таблица 4.6. Стандартные плагины контроллера.
Стандартный класс плагина Описание
Params Позволяет извлечь переменные из HTTP-запроса, включая переменные GET и POST
Url Позволяет генерировать абсолютные или относительные URL изнутри контроллеров.
Layout Дает модели представления лэйаута доступ для передачи данных шаблону лэйаута.
Identity Возвращает личность (identity) пользователя, который зашел на вебсайт.
FlashMessenger Позволяет определить "flash"-сообщения, который хранятся сессией, и могут быть отображены на другой странице.
Redirect Позволяет перенаправить запрос методу действия другого контроллера.
PostRedirectGet Перенаправляет POST-запрос, конвертирует все POST-переменные в GET-переменные.
FilePostRedirectGet Перенаправляет POST-запрос, сохраняя выгруженные файлы (uploaded files).

Внутри метода действия контроллера, вы получаете доступ к плагину следующим образом:

// Доступ к плагину Url
$urlPlugin = $this->url();

// Доступ к плагину лэйаутов
$layoutPlugin = $this->layout();

// Доступ к плагину перенаправления
$redirectPlugin = $this->redirect();

В качестве альтернативы вы можете вызвать плагин по его полностью квалифицированному имени с помощью метода plugin(), предоставлемого базовым классом контроллера, следующим образом:

use Zend\Mvc\Controller\Plugin\Url; 
 
// Inside your controller's action use the plugin() method.
$urlPlugin = $this->plugin(Url::class);

4.11.1. Пишем свой собственный плагин контроллера

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

Плагин контроллера должен наследоваться от класса AbstractPlugin. Плагины, как правило, существуют в своем собственном пространстве имен Plugin, которое находится в пространстве имен Controller:

<?php
namespace Application\Controller\Plugin; 

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

// Класс плагина
class AccessPlugin extends AbstractPlugin 
{
    // Этот метод проверяет, разрешено ли пользователю
    // посетить страницу
    public function checkAccess($actionName)
    {
        // ...
    }
}

Чтобы дать Zend Framework 3 знать о вашем плагине,вам нужно зарегистрировать его в файле module.config.php под ключом controller_plugins. Пример смотрите ниже:

<?php
return [
    // ... 
 
    'controller_plugins' => [
        'factories' => [
            Controller\Plugin\AccessPlugin::class => InvokableFactory::class,
        ],
	    'aliases' => [
		    'access' => Controller\Plugin\AccessPlugin::class,
	    ]
    ],
 
    // ...
];

Обратите внимание, мы также создаем псевдоним для плагина, чтобы иметь возможность обратиться к нему по его краткому имени.

После этого вы будете иметь доступ к созданному вами плагину изо всех действий ваших контроллеров следующим образом:

// Проверяем, разрешено ли пользователю посещать страницу регистрации
$isAllowed = $this->access()->checkAccess('index');

Top