1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
4 <title>Помощники действий</title>
6 <sect2 id="zend.controller.actionhelper.introduction">
7 <title>Введение</title>
9 Помощники действий (action helpers) дают разработчикам возможность
10 добавлять функционал во время выполнения или по требованию в любые
11 контроллеры действий, которые наследуют от
12 <classname>Zend_Controller_Action</classname>.
13 Помощники действий помогают снизить необходимость в наследовании от
14 абстрактного контроллера действий при добавлении общего
15 функционала в контроллер действий.
19 Есть несколько вариантов использования помощников действий.
20 Помощники действий используют брокерскую систему (brokerage system),
21 подобную той, которая используется в
22 <link linkend="zend.view.helpers">Zend_View_Helper</link> и
23 <link linkend="zend.controller.plugins">Zend_Controller_Plugin</link>.
24 Помощники действий (как и <classname>Zend_View_Helper</classname>) могут быть
25 загружены и вызваны по требованию, либо инстанцироваться во время
26 запроса (начальной загрузки) или создания контроллера действий
27 (init()). Для того, чтобы лучше разобраться с этим, см. ниже раздел
32 <sect2 id="zend.controller.actionhelper.initialization">
33 <title>Инициализация помощника</title>
36 Помощник может быть инициализирован несколькими различными
37 способами, выбор способа зависит от ваших нужд и от
38 функционала, предоставляемого этим помощником.
42 Брокер помощников хранится как член <varname>$_helper</varname> класса
43 <classname>Zend_Controller_Action</classname>; используйте брокер для
44 получения или вызова помощников. Методы для этого включают в себя:
50 Явное использование метода <code>getHelper()</code>. Просто
51 передайте ему имя, и будет возвращен объект помощника:
54 <programlisting language="php"><![CDATA[
55 $flashMessenger = $this->_helper->getHelper('FlashMessenger');
56 $flashMessenger->addMessage('We did something in the last request');
62 Используйте функционал "волшебного" метода
63 <code>__get()</code> брокера помощников - извлекайте
64 помощника так же, как если бы он был свойством этого брокера:
67 <programlisting language="php"><![CDATA[
68 $flashMessenger = $this->_helper->FlashMessenger;
69 $flashMessenger->addMessage('We did something in the last request');
75 И наконец, большинство помощников действий реализует метод
76 <code>direct()</code>, который будет вызывать особый,
77 используемый по умолчанию метод в помощнике. Например, в
78 случае <code>FlashMessenger</code> будет вызван метод
79 <code>addMessage()</code>:
82 <programlisting language="php"><![CDATA[
83 $this->_helper->FlashMessenger('We did something in the last request');
90 Все примеры выше функционально эквивалентны.
95 Вы можете также явно инстанцировать помощников. Вы можете захотеть
96 сделать это, если используете помощника вне контроллера действий,
97 или если хотите передавать помощника брокеру для использования в
98 любых действиях. Инстанцирование производится так же, как и для
99 любого другого класса PHP.
103 <sect2 id="zend.controller.actionhelper.broker">
104 <title>Брокер помощников</title>
107 <classname>Zend_Controller_Action_HelperBroker</classname> управляет
108 регистрацией объектов помощников и путей к помощникам, а также
109 извлечением помощников по требованию.
113 Для того, чтобы зарегистрировать помощника через брокер, используйте
114 <code>addHelper</code>:
117 <programlisting language="php"><![CDATA[
118 Zend_Controller_Action_HelperBroker::addHelper($helper);
122 Само собой, инстанцирование и передача помощников брокеру отнимают
123 некоторое время и ресурсы, поэтому существуют два метода для
124 некоторой автоматизации: <code>addPrefix()</code> и
125 <code>addPath()</code>.
131 <code>addPrefix()</code> принимает префикс класса и
132 использует его для определения пути, по которому определен
133 класс помощника. Подразумевается, что префикс следует
134 соглашениям по именованию классов Zend Framework-а.
137 <programlisting language="php"><![CDATA[
138 // Добавление помощников, начинающихся
139 // с My_Action_Helpers в My/Action/Helpers/
140 Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
146 <code>addPath()</code> принимает директорию в качестве
147 первого аргумента и префикс класса в качестве второго (по
148 умолчанию это 'Zend_Controller_Action_Helper'). Это
149 позволяет поставить в соответствие определенным
150 директориям собственные префиксы классов.
153 <programlisting language="php"><![CDATA[
154 // Добавление помощников, начинающихся с Helper в Plugins/Helpers/
155 Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
162 Поскольку эти методы статические, то они могут вызываться из любого
163 места в цепочке контроллеров для динамического добавления
164 помощников при необходимости.
168 Внутри себя брокер помощников использует <link
169 linkend="zend.loader.pluginloader">экземпляр PluginLoader</link>
170 для поддержки путей. Вы можете извлечь PluginLoader, используя
171 статический метод <code>getPluginLoader()</code>, или
172 добавить свой экземпляр PluginLoader, используя
173 <code>setPluginLoader()</code>.
177 Для определения того, есть ли помощник в брокере, используйте
178 <code>hasHelper($name)</code>, где <varname>$name</varname> - короткое
179 имя помощника без префикса:
182 <programlisting language="php"><![CDATA[
183 // Проверка, зарегистрирован ли помощник 'redirector' в брокере:
184 if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
185 echo 'Redirector helper registered';
190 Есть также два статических метода для извлечения помощников из
191 брокера помощников: <code>getExistingHelper()</code> и
192 <code>getStaticHelper()</code>. <code>getExistingHelper()</code>
193 будет извлекать помощника только если он был ранее вызван или явно
194 зарегистрирован через брокер помощников, иначе бросается исключение.
195 <code>getStaticHelper()</code> делает то же самое, что и
196 <code>getExistingHelper()</code>, за тем исключением, что будет
197 пытаться инстанцировать помощника, если он еще не был
198 зарегистрирован в стеке помощников. <code>getStaticHelper()</code>
199 является хорошим выбором, если нужно извлечь помощника для конфигурирования.
203 Оба метода принимают единственный аргумент, <varname>$name</varname>,
204 который является коротким именем помощника (без префикса).
207 <programlisting language="php"><![CDATA[
208 // Проверка, зарегистрирован ли помощник 'redirector' в брокере,
210 if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
212 Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
215 // Или просто извлеките его, не заботясь о том,
216 // был ли он ранее зарегистрирован:
218 Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
223 Наконец, для удаления зарегистрированного помощника из брокера
224 используйте <code>removeHelper($name)</code>, где <varname>$name</varname>
225 - короткое имя помощника без префикса:
228 <programlisting language="php"><![CDATA[
229 // Удаление помощника 'redirector' из брокера, помещенное
230 // в условную конструкцию
231 if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
232 Zend_Controller_Action_HelperBroker::removeHelper('redirector')
237 <sect2 id="zend.controller.actionhelper.stockhelpers">
238 <title>Встроенные помощники действий</title>
241 Zend Framework уже содержит в себе набор помощников действий:
242 <code>AutoComplete</code> автоматизирует ответы для автозавершения
243 ввода с использованием AJAX; <code>ContextSwitch</code> и
244 <code>AjaxContext</code> для обслуживания альтернативных форматов
245 ответов для ваших действий; <code>FlashMessenger</code> для
246 управления сессионными сообщениями; <code>Json</code> для
247 кодирования и отправки ответов JSON; <code>Redirector</code>,
248 предоставляющий различные реализации перенаправления из вашего
249 приложения на внутренние и внешние страницы; и
250 <code>ViewRenderer</code>, автоматизирующий процесс настройки
251 объекта вида в контроллерах и рендеринга видов.
254 <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml">
255 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ActionStack.xml" /></xi:fallback>
257 <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml">
258 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-AutoComplete.xml" /></xi:fallback>
260 <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml">
261 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml" /></xi:fallback>
263 <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml">
264 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-FlashMessenger.xml" /></xi:fallback>
266 <xi:include href="Zend_Controller-ActionHelpers-Json.xml">
267 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-Json.xml" /></xi:fallback>
269 <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml">
270 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-Redirector.xml" /></xi:fallback>
272 <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml">
273 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ViewRenderer.xml" /></xi:fallback>
277 <sect2 id="zend.controller.actionhelper.writingyourown">
278 <title>Написание собственных помощников</title>
281 Помощники действий наследуют от абстрактного класса
282 <classname>Zend_Controller_Action_Helper_Abstract</classname>,
283 который предоставляет базовый интерфейс и функционал, необходимые
284 для использования с брокером помощников. Он включает в себя
291 <code>setActionController()</code> используется для
292 установки текущего контроллера действий.
298 <code>init()</code>, запускаемый брокером при
299 инстанцировании, может использоваться для запуска
300 инициализации в помощнике. Это может быть полезным для
301 переустановки состояния, когда несколько контроллеров
302 используют один и тот же помощник в цепочке действий.
308 <code>preDispatch()</code> запускается до того, как будет
315 <code>postDispatch()</code> запускается, когда
316 выполнение действия завершилось - даже если
317 плагин <code>preDispatch()</code> пропустил это действие.
318 Полезно в основном для очистки.
324 <code>getRequest()</code> возвращает текущий объект запроса.
330 <code>getResponse()</code> возвращает текущий объект ответа.
336 <code>getName()</code> возвращает имя помощника. Он
337 извлекает ту часть имени класса, которая следует после
338 последнего символа подчеркивания, иначе возвращается полное
339 имя класса. Например, если класс называется
340 <classname>Zend_Controller_Action_Helper_Redirector</classname>,
341 то он вернет <code>Redirector</code>, а если класс называется
342 <code>FooMessage</code> то он просто вернет свое полное имя.
348 Вы можете опционально добавить метод <code>direct()</code> в свой
349 класс помощника. Если он определен, то это позволит вам обращаться к
350 помощнику как к методу брокера помощников, этим обеспечивается
351 легкое единовременное использование помощника. Например,
352 <link linkend="zend.controller.actionhelpers.redirector">redirector</link>
353 определяет <code>direct()</code> как псевдоним метода
354 <code>goto()</code>, что позволяет использовать помощника следующим
358 <programlisting language="php"><![CDATA[
359 // Перенаправление на /blog/view/item/id/42
360 $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
364 Метод брокера помощников <code>__call()</code> ищет помощника с
365 именем <code>redirector</code>, затем смотрит, имеет ли помощник
366 определенный метод <code>direct</code>, и, если есть, вызывает его с
367 переданными аргументами.
371 Создав собственный класс помощника, вы можете предоставить доступ к
372 нему, как описано в разделах выше.