Zend_Controller-ActionHelpers.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
  4. <title>Помощники действий</title>
  5. <sect2 id="zend.controller.actionhelper.introduction">
  6. <title>Введение</title>
  7. <para>
  8. Помощники действий (action helpers) дают разработчикам возможность
  9. добавлять функционал во время выполнения или по требованию в любые
  10. контроллеры действий, которые наследуют от
  11. <classname>Zend_Controller_Action</classname>.
  12. Помощники действий помогают снизить необходимость в наследовании от
  13. абстрактного контроллера действий при добавлении общего
  14. функционала в контроллер действий.
  15. </para>
  16. <para>
  17. Есть несколько вариантов использования помощников действий.
  18. Помощники действий используют брокерскую систему (brokerage system),
  19. подобную той, которая используется в
  20. <link linkend="zend.view.helpers">Zend_View_Helper</link> и
  21. <link linkend="zend.controller.plugins">Zend_Controller_Plugin</link>.
  22. Помощники действий (как и <classname>Zend_View_Helper</classname>) могут быть
  23. загружены и вызваны по требованию, либо инстанцироваться во время
  24. запроса (начальной загрузки) или создания контроллера действий
  25. (init()). Для того, чтобы лучше разобраться с этим, см. ниже раздел
  26. по использованию.
  27. </para>
  28. </sect2>
  29. <sect2 id="zend.controller.actionhelper.initialization">
  30. <title>Инициализация помощника</title>
  31. <para>
  32. Помощник может быть инициализирован несколькими различными
  33. способами, выбор способа зависит от ваших нужд и от
  34. функционала, предоставляемого этим помощником.
  35. </para>
  36. <para>
  37. Брокер помощников хранится как член <varname>$_helper</varname> класса
  38. <classname>Zend_Controller_Action</classname>; используйте брокер для
  39. получения или вызова помощников. Методы для этого включают в себя:
  40. </para>
  41. <itemizedlist>
  42. <listitem>
  43. <para>
  44. Явное использование метода <code>getHelper()</code>. Просто
  45. передайте ему имя, и будет возвращен объект помощника:
  46. </para>
  47. <programlisting language="php"><![CDATA[
  48. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
  49. $flashMessenger->addMessage('We did something in the last request');
  50. ]]></programlisting>
  51. </listitem>
  52. <listitem>
  53. <para>
  54. Используйте функционал "волшебного" метода
  55. <code>__get()</code> брокера помощников - извлекайте
  56. помощника так же, как если бы он был свойством этого брокера:
  57. </para>
  58. <programlisting language="php"><![CDATA[
  59. $flashMessenger = $this->_helper->FlashMessenger;
  60. $flashMessenger->addMessage('We did something in the last request');
  61. ]]></programlisting>
  62. </listitem>
  63. <listitem>
  64. <para>
  65. И наконец, большинство помощников действий реализует метод
  66. <code>direct()</code>, который будет вызывать особый,
  67. используемый по умолчанию метод в помощнике. Например, в
  68. случае <code>FlashMessenger</code> будет вызван метод
  69. <code>addMessage()</code>:
  70. </para>
  71. <programlisting language="php"><![CDATA[
  72. $this->_helper->FlashMessenger('We did something in the last request');
  73. ]]></programlisting>
  74. </listitem>
  75. </itemizedlist>
  76. <note>
  77. <para>
  78. Все примеры выше функционально эквивалентны.
  79. </para>
  80. </note>
  81. <para>
  82. Вы можете также явно инстанцировать помощников. Вы можете захотеть
  83. сделать это, если используете помощника вне контроллера действий,
  84. или если хотите передавать помощника брокеру для использования в
  85. любых действиях. Инстанцирование производится так же, как и для
  86. любого другого класса PHP.
  87. </para>
  88. </sect2>
  89. <sect2 id="zend.controller.actionhelper.broker">
  90. <title>Брокер помощников</title>
  91. <para>
  92. <classname>Zend_Controller_Action_HelperBroker</classname> управляет
  93. регистрацией объектов помощников и путей к помощникам, а также
  94. извлечением помощников по требованию.
  95. </para>
  96. <para>
  97. Для того, чтобы зарегистрировать помощника через брокер, используйте
  98. <code>addHelper</code>:
  99. </para>
  100. <programlisting language="php"><![CDATA[
  101. Zend_Controller_Action_HelperBroker::addHelper($helper);
  102. ]]></programlisting>
  103. <para>
  104. Само собой, инстанцирование и передача помощников брокеру отнимают
  105. некоторое время и ресурсы, поэтому существуют два метода для
  106. некоторой автоматизации: <code>addPrefix()</code> и
  107. <code>addPath()</code>.
  108. </para>
  109. <itemizedlist>
  110. <listitem>
  111. <para>
  112. <code>addPrefix()</code> принимает префикс класса и
  113. использует его для определения пути, по которому определен
  114. класс помощника. Подразумевается, что префикс следует
  115. соглашениям по именованию классов Zend Framework-а.
  116. </para>
  117. <programlisting language="php"><![CDATA[
  118. // Добавление помощников, начинающихся
  119. // с My_Action_Helpers в My/Action/Helpers/
  120. Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
  121. ]]></programlisting>
  122. </listitem>
  123. <listitem>
  124. <para>
  125. <code>addPath()</code> принимает директорию в качестве
  126. первого аргумента и префикс класса в качестве второго (по
  127. умолчанию это 'Zend_Controller_Action_Helper'). Это
  128. позволяет поставить в соответствие определенным
  129. директориям собственные префиксы классов.
  130. </para>
  131. <programlisting language="php"><![CDATA[
  132. // Добавление помощников, начинающихся с Helper в Plugins/Helpers/
  133. Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
  134. 'Helper');
  135. ]]></programlisting>
  136. </listitem>
  137. </itemizedlist>
  138. <para>
  139. Поскольку эти методы статические, то они могут вызываться из любого
  140. места в цепочке контроллеров для динамического добавления
  141. помощников при необходимости.
  142. </para>
  143. <para>
  144. Внутри себя брокер помощников использует <link
  145. linkend="zend.loader.pluginloader">экземпляр PluginLoader</link>
  146. для поддержки путей. Вы можете извлечь PluginLoader, используя
  147. статический метод <code>getPluginLoader()</code>, или
  148. добавить свой экземпляр PluginLoader, используя
  149. <code>setPluginLoader()</code>.
  150. </para>
  151. <para>
  152. Для определения того, есть ли помощник в брокере, используйте
  153. <code>hasHelper($name)</code>, где <varname>$name</varname> - короткое
  154. имя помощника без префикса:
  155. </para>
  156. <programlisting language="php"><![CDATA[
  157. // Проверка, зарегистрирован ли помощник 'redirector' в брокере:
  158. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  159. echo 'Redirector helper registered';
  160. }
  161. ]]></programlisting>
  162. <para>
  163. Есть также два статических метода для извлечения помощников из
  164. брокера помощников: <code>getExistingHelper()</code> и
  165. <code>getStaticHelper()</code>. <code>getExistingHelper()</code>
  166. будет извлекать помощника только если он был ранее вызван или явно
  167. зарегистрирован через брокер помощников, иначе бросается исключение.
  168. <code>getStaticHelper()</code> делает то же самое, что и
  169. <code>getExistingHelper()</code>, за тем исключением, что будет
  170. пытаться инстанцировать помощника, если он еще не был
  171. зарегистрирован в стеке помощников. <code>getStaticHelper()</code>
  172. является хорошим выбором, если нужно извлечь помощника для конфигурирования.
  173. </para>
  174. <para>
  175. Оба метода принимают единственный аргумент, <varname>$name</varname>,
  176. который является коротким именем помощника (без префикса).
  177. </para>
  178. <programlisting language="php"><![CDATA[
  179. // Проверка, зарегистрирован ли помощник 'redirector' в брокере,
  180. // и его извлечение:
  181. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  182. $redirector =
  183. Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
  184. }
  185. // Или просто извлеките его, не заботясь о том,
  186. // был ли он ранее зарегистрирован:
  187. $redirector =
  188. Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
  189. }
  190. ]]></programlisting>
  191. <para>
  192. Наконец, для удаления зарегистрированного помощника из брокера
  193. используйте <code>removeHelper($name)</code>, где <varname>$name</varname>
  194. - короткое имя помощника без префикса:
  195. </para>
  196. <programlisting language="php"><![CDATA[
  197. // Удаление помощника 'redirector' из брокера, помещенное
  198. // в условную конструкцию
  199. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  200. Zend_Controller_Action_HelperBroker::removeHelper('redirector')
  201. }
  202. ]]></programlisting>
  203. </sect2>
  204. <sect2 id="zend.controller.actionhelper.stockhelpers">
  205. <title>Встроенные помощники действий</title>
  206. <para>
  207. Zend Framework уже содержит в себе набор помощников действий:
  208. <code>AutoComplete</code> автоматизирует ответы для автозавершения
  209. ввода с использованием AJAX; <code>ContextSwitch</code> и
  210. <code>AjaxContext</code> для обслуживания альтернативных форматов
  211. ответов для ваших действий; <code>FlashMessenger</code> для
  212. управления сессионными сообщениями; <code>Json</code> для
  213. кодирования и отправки ответов JSON; <code>Redirector</code>,
  214. предоставляющий различные реализации перенаправления из вашего
  215. приложения на внутренние и внешние страницы; и
  216. <code>ViewRenderer</code>, автоматизирующий процесс настройки
  217. объекта вида в контроллерах и рендеринга видов.
  218. </para>
  219. <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml">
  220. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ActionStack.xml" /></xi:fallback>
  221. </xi:include>
  222. <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml">
  223. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-AutoComplete.xml" /></xi:fallback>
  224. </xi:include>
  225. <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml">
  226. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml" /></xi:fallback>
  227. </xi:include>
  228. <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml">
  229. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-FlashMessenger.xml" /></xi:fallback>
  230. </xi:include>
  231. <xi:include href="Zend_Controller-ActionHelpers-Json.xml">
  232. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-Json.xml" /></xi:fallback>
  233. </xi:include>
  234. <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml">
  235. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-Redirector.xml" /></xi:fallback>
  236. </xi:include>
  237. <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml">
  238. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-ActionHelpers-ViewRenderer.xml" /></xi:fallback>
  239. </xi:include>
  240. </sect2>
  241. <sect2 id="zend.controller.actionhelper.writingyourown">
  242. <title>Написание собственных помощников</title>
  243. <para>
  244. Помощники действий наследуют от абстрактного класса
  245. <classname>Zend_Controller_Action_Helper_Abstract</classname>,
  246. который предоставляет базовый интерфейс и функционал, необходимые
  247. для использования с брокером помощников. Он включает в себя
  248. следующие методы:
  249. </para>
  250. <itemizedlist>
  251. <listitem>
  252. <para>
  253. <code>setActionController()</code> используется для
  254. установки текущего контроллера действий.
  255. </para>
  256. </listitem>
  257. <listitem>
  258. <para>
  259. <code>init()</code>, запускаемый брокером при
  260. инстанцировании, может использоваться для запуска
  261. инициализации в помощнике. Это может быть полезным для
  262. переустановки состояния, когда несколько контроллеров
  263. используют один и тот же помощник в цепочке действий.
  264. </para>
  265. </listitem>
  266. <listitem>
  267. <para>
  268. <code>preDispatch()</code> запускается до того, как будет
  269. запущено действие.
  270. </para>
  271. </listitem>
  272. <listitem>
  273. <para>
  274. <code>postDispatch()</code> запускается, когда
  275. выполнение действия завершилось - даже если
  276. плагин <code>preDispatch()</code> пропустил это действие.
  277. Полезно в основном для очистки.
  278. </para>
  279. </listitem>
  280. <listitem>
  281. <para>
  282. <code>getRequest()</code> возвращает текущий объект запроса.
  283. </para>
  284. </listitem>
  285. <listitem>
  286. <para>
  287. <code>getResponse()</code> возвращает текущий объект ответа.
  288. </para>
  289. </listitem>
  290. <listitem>
  291. <para>
  292. <code>getName()</code> возвращает имя помощника. Он
  293. извлекает ту часть имени класса, которая следует после
  294. последнего символа подчеркивания, иначе возвращается полное
  295. имя класса. Например, если класс называется
  296. <classname>Zend_Controller_Action_Helper_Redirector</classname>,
  297. то он вернет <code>Redirector</code>, а если класс называется
  298. <code>FooMessage</code> то он просто вернет свое полное имя.
  299. </para>
  300. </listitem>
  301. </itemizedlist>
  302. <para>
  303. Вы можете опционально добавить метод <code>direct()</code> в свой
  304. класс помощника. Если он определен, то это позволит вам обращаться к
  305. помощнику как к методу брокера помощников, этим обеспечивается
  306. легкое единовременное использование помощника. Например,
  307. <link linkend="zend.controller.actionhelpers.redirector">redirector</link>
  308. определяет <code>direct()</code> как псевдоним метода
  309. <code>goto()</code>, что позволяет использовать помощника следующим
  310. образом:
  311. </para>
  312. <programlisting language="php"><![CDATA[
  313. // Перенаправление на /blog/view/item/id/42
  314. $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
  315. ]]></programlisting>
  316. <para>
  317. Метод брокера помощников <code>__call()</code> ищет помощника с
  318. именем <code>redirector</code>, затем смотрит, имеет ли помощник
  319. определенный метод <code>direct</code>, и, если есть, вызывает его с
  320. переданными аргументами.
  321. </para>
  322. <para>
  323. Создав собственный класс помощника, вы можете предоставить доступ к
  324. нему, как описано в разделах выше.
  325. </para>
  326. </sect2>
  327. </sect1>
  328. <!--
  329. vim:se ts=4 sw=4 et:
  330. -->