Плагин контроллера - это класс, который некоторым образом расширяет функциональность всех контроллеров.
Без плагинов, чтобы расширить функциональность всех контроллеров, вам нужно бы было создать базовый класс, скажем,
BaseController
, и наследовать другие контроллеры от этого базового класса. Так тоже можно делать, но с точки зрения создателей ZF3 плагины - решение лучше, так как они используют композицию классов 2, которая обеспечивает большую гибкость по сравнению с наследованием классов. Вы создаете ваш плагин контроллера, и он автоматически становится доступным изо всех контроллеров вашего приложения (базовый классAbstractActionController
использует магический PHP-метод__call()
для передачи вызовов созданным плагинам контроллеров.).
2) Композиция - это взаимосвязь между двумя классами, называемая "has-a" и лучше всего описываемая как отношение "часть - целое". Класс-владелец содержит ссылку на другой класс (плагин). Владелец ответственен за существование объекта, который он содержит.
Существует несколько стандартных плагинов контроллера (см. таблицу 4.6), и мы уже использовали один из них (Params
)
в одном из предыдущих примеров.
Стандартный класс плагина | Описание |
---|---|
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);
На вашем вебсайте вам, вероятно, понадобится создать свои собственные плагины контроллеров.
Например, представьте, что вам нужно, чтобы все ваши классы контроллеров могли проверять, доступно
ли пользователю сайта то или иное действие контроллера. Это можно сделать, используя класс 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');