Архитектура контроллеров включает в себя систему плагинов, которая позволяет добавлять свой код, который будет вызываться при определенных событиях в процессе жизни контроллера. Фронт-контроллер использует брокер плагинов (plugin broker, можно также перевести как "посредник" - прим. перев.) для регистрации пользовательских плагинов, он обеспечивает вызов методов событий в каждом плагине, зарегистрированном через фронт-контроллер.
Методы событий определены в абстрактном классе
Zend_Controller_Plugin_Abstract, от которого должны
наследовать все пользовательские плагины:
routeStartup() вызывается до того, как
Zend_Controller_Front начнет сопоставление
запроса с маршрутами.
routeShutdown() вызывается после того, как
Zend_Controller_Router завершит свою
работу во фронт-контроллере.
dispatchLoopStartup() вызывается до того,
как Zend_Controller_Front войдет в цикл
диспетчеризации.
preDispatch() вызывается до того, как
диспетчером будет запущено действие. Этот обратный
вызов позволяет реализовать поведение посредника или
фильтра. Через изменение запроса и сброс его
флага диспетчеризации (методом
Zend_Controller_Request_Abstract::setDispatched(false))
текущее действие может быть пропущено.
postDispatch() вызывается после того, как
действие было вызвано диспетчером. Этот обратный вызов
позволяет реализовать поведение фильтра или посредника.
Через изменение запроса и сброс его
флага диспетчеризации (методом
Zend_Controller_Request_Abstract::setDispatched(false))
может быть определено новое действие для
диспетчеризации.
dispatchLoopShutdown() вызывается до того,
как Zend_Controller_Front выйдет из цикла
диспетчеризации.
Для того, чтобы написать класс плагина, просто включите абстрактный
класс Zend_Controller_Plugin_Abstract и создайте его
подкласс:
<?php
require_once 'Zend/Controller/Plugin/Abstract.php';
class MyPlugin extends Zend_Controller_Plugin_Abstract
{
// ...
}
Ни один из методов класса
Zend_Controller_Plugin_Abstract не является
абстрактным, поэтому классы плагинов не обязательно должны
реализовать все из перечисленных выше методов. Разработчики плагинов
могут реализовать только те методы, которые соответствуют их нуждам.
Zend_Controller_Plugin_Abstract также делает объекты
запроса и ответа доступными плагинам контроллеров через методы
getRequest() и getResponse()
соответственно.
Классы плагинов регистрируются через
Zend_Controller_Front::registerPlugin() до начала
диспетчеризации. Следующий пример демонстрирует использование
плагина:
<?php
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Router.php';
require_once 'Zend/Controller/Plugin/Abstract.php';
class MyPlugin extends Zend_Controller_Plugin_Abstract
{
public function routeStartup()
{
$this->getResponse()->appendBody('<p>routeStartup() called</p>');
}
public function routeShutdown($request)
{
$this->getResponse()->appendBody('<p>routeShutdown() called</p>');
}
public function dispatchLoopStartup($request)
{
$this->getResponse()->appendBody('<p>dispatchLoopStartup() called</p>');
}
public function preDispatch($request)
{
$this->getResponse()->appendBody('<p>preDispatch() called</p>');
}
public function postDispatch($request)
{
$this->getResponse()->appendBody('<p>postDispatch() called</p>');
}
public function dispatchLoopShutdown()
{
$this->getResponse()->appendBody('<p>dispatchLoopShutdown() called</p>');
}
}
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('/path/to/controllers')
->setRouter(new Zend_Controller_Router())
->registerPlugin(new MyPlugin());
$response = $controller->dispatch();
echo $response;