1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.controller.plugins" xmlns:xi="http://www.w3.org/2001/XInclude">
6 <sect2 id="zend.controller.plugins.introduction">
7 <title>Введение</title>
10 Архитектура контроллеров включает в себя систему плагинов, которая
11 позволяет добавлять свой код, который будет вызываться при
12 определенных событиях в процессе жизни контроллера. Фронт-контроллер
13 использует брокер плагинов (plugin broker) в качестве реестра
14 пользовательских плагинов, брокер плагинов также обеспечивает вызов
15 методов событий в каждом плагине, зарегистрированном через
20 Методы событий определены в абстрактном классе
21 <classname>Zend_Controller_Plugin_Abstract</classname>, от которого должны
22 наследовать все пользовательские плагины:
28 <code>routeStartup()</code> вызывается до того, как
29 <classname>Zend_Controller_Front</classname> вызовет
30 <link linkend="zend.controller.router">маршрутизатор</link>
31 для сопоставления запроса с зарегистрированными маршрутами.
37 <code>routeShutdown()</code> вызывается после того, как
38 <link linkend="zend.controller.router">маршрутизатор</link>
39 завершит обработку запроса.
45 <code>dispatchLoopStartup()</code> вызывается до того,
46 как <classname>Zend_Controller_Front</classname> войдет в цикл
53 <code>preDispatch()</code> вызывается до того, как
54 <link linkend="zend.controller.dispatcher">диспетчером</link>
55 будет вызвано действие. Этот обратный
56 вызов (callback) позволяет реализовать поведение посредника
57 или фильтра. Через изменение запроса и сброс его
58 флага диспетчеризации (методом
59 <code>Zend_Controller_Request_Abstract::setDispatched(false)</code>)
60 текущее действие может быть пропущено и/или заменено на
67 <code>postDispatch()</code> вызывается после того, как
69 <link linkend="zend.controller.dispatcher">диспетчером</link>.
70 Этот обратный вызов позволяет реализовать поведение фильтра
71 или посредника. Через изменение запроса и сброс его
72 флага диспетчеризации (методом
73 <code>Zend_Controller_Request_Abstract::setDispatched(false)</code>)
74 может быть определено новое действие для
81 <code>dispatchLoopShutdown()</code> вызывается после выхода
82 <classname>Zend_Controller_Front</classname> из его цикла
89 <sect2 id="zend.controller.plugins.writing">
90 <title>Написание плагинов</title>
93 Для того, чтобы написать класс плагина, просто включите и расширьте
94 абстрактный класс <classname>Zend_Controller_Plugin_Abstract</classname>:
97 <programlisting language="php"><![CDATA[
98 class MyPlugin extends Zend_Controller_Plugin_Abstract
105 Ни один из методов класса
106 <classname>Zend_Controller_Plugin_Abstract</classname> не является
107 абстрактным, поэтому классы плагинов не обязательно должны
108 реализовывать все из перечисленных выше методов событий.
109 Разработчики плагинов могут реализовывать только те методы, которые
110 требуются для их конкретных нужд.
114 <classname>Zend_Controller_Plugin_Abstract</classname> также делает объекты
115 запроса и ответа доступными плагинам контроллеров через методы
116 <code>getRequest()</code> и <code>getResponse()</code>,
121 <sect2 id="zend.controller.plugins.using">
122 <title>Использование плагинов</title>
125 Классы плагинов регистрируются через
126 <code>Zend_Controller_Front::registerPlugin()</code>, их можно
127 регистрировать в любой момент времени. Следующий пример
128 демонстрирует использование плагина в цепочке контроллеров:
131 <programlisting language="php"><![CDATA[
132 class MyPlugin extends Zend_Controller_Plugin_Abstract
134 public function routeStartup(Zend_Controller_Request_Abstract $request)
137 ->appendBody("<p>routeStartup() called</p>\n");
140 public function routeShutdown(Zend_Controller_Request_Abstract $request)
143 ->appendBody("<p>routeShutdown() called</p>\n");
146 public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
149 ->appendBody("<p>dispatchLoopStartup() called</p>\n");
152 public function preDispatch(Zend_Controller_Request_Abstract $request)
155 ->appendBody("<p>preDispatch() called</p>\n");
158 public function postDispatch(Zend_Controller_Request_Abstract $request)
161 ->appendBody("<p>postDispatch() called</p>\n");
164 public function dispatchLoopShutdown()
167 ->appendBody("<p>dispatchLoopShutdown() called</p>\n");
171 $front = Zend_Controller_Front::getInstance();
172 $front->setControllerDirectory('/path/to/controllers')
173 ->setRouter(new Zend_Controller_Router_Rewrite())
174 ->registerPlugin(new MyPlugin());
179 При условии, что вызываемые действия не производят вывод, и
180 что вызвано только одно действие, с плагином выше должен получиться
184 <programlisting language="php"><![CDATA[
185 <p>routeStartup() called</p>
186 <p>routeShutdown() called</p>
187 <p>dispatchLoopStartup() called</p>
188 <p>preDispatch() called</p>
189 <p>postDispatch() called</p>
190 <p>dispatchLoopShutdown() called</p>
195 Плагины могут регистрироваться в любой точке выполнения
196 фронт-контроллера. Однако, если событие, для которого
197 плагин имеет зарегистрированный метод события, уже произошло, то
198 этот метод не будет запущен.
203 <sect2 id="zend.controller.plugins.manipulating">
204 <title>Извлечение и работа с плагинами</title>
207 Иногда может понадобиться отменить регистрацию плагина или извлечь
208 его. Следующие методы фронт-контроллера позволяют сделать это:
213 <code>getPlugin($class)</code> позволяет извлекать плагин по
214 имени класса. Если не найден соответствующий плагин, то
215 возвращается false. Если зарегистрировано более одного плагина
216 этого класса, то будет возвращен массив.
220 <code>getPlugins()</code> возвращает весь стек плагинов.
224 <code>unregisterPlugin($plugin)</code> производит удаление
225 плагина из стека. Вы можете передавать объект плагина или имя
226 класса плагина, регистрацию которого вы хотите отменить. Если вы
227 передаете имя класса, то будут удалены все плагины этого класса.
232 <sect2 id="zend.controller.plugins.standard">
233 <title>Плагины, включенные в стандартную поставку</title>
236 Zend Framework в его стандартной поставке включает в себя плагин для
240 <xi:include href="Zend_Controller-Plugins-ActionStack.xml" />
241 <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml" />