Zend_Controller-ActionHelpers.xml 21 KB

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