Zend_Controller-ActionHelpers.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. 动作助手可以向任何Zend_Controller_Action的衍生动作控制器中,即时的加入功能(runtime and/or on-demand functionality),以使得增加公共的动作控制器功能时,尽量减少衍生动作控制器类的必要。
  7. </para>
  8. <para>
  9. 动作助手有多种使用方式。动作助手使用了一套经纪系统(brokerage system),与<link linkend="zend.view.helpers">Zend_View_Helper</link>中使用的,也就是<link linkend="zend.controller.plugins">Zend_Controller_Plugin</link>的经纪系统类似。动作助手(like <code>Zend_View_Helper</code>)在需要调用时加载,可以在请求的时候(bootstrap)或者动作控制器创建的时候(init())实例化。要充分了解这些细节,请阅读下面的章节。
  10. </para>
  11. </sect2>
  12. <sect2 id="zend.controller.actionhelper.initialization">
  13. <title>初始化助手</title>
  14. <para>
  15. 根据需求以及助手的功能,可有几种不同的初始化方式。
  16. </para>
  17. <para>
  18. 助手经纪人(broker)存储在<code>Zend_Controller_Action</code>的 <code>$_helper</code>成员中,可以使用经纪人来获取或者调用助手。以下是操作方法:
  19. </para>
  20. <itemizedlist>
  21. <listitem>
  22. <para>
  23. 显式的调用<code>getHelper()</code>方法。简单的传入助手名字,就可以返回助手对象。
  24. </para>
  25. <programlisting role="php"><![CDATA[
  26. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
  27. $flashMessenger->addMessage('We did something in the last request');
  28. ]]>
  29. </programlisting>
  30. </listitem>
  31. <listitem>
  32. <para>
  33. 使用助手经纪人的<code>__get()</code>方法,就像获取经纪人的成员属性一样获取助手。
  34. </para>
  35. <programlisting role="php"><![CDATA[
  36. $flashMessenger = $this->_helper->FlashMessenger;
  37. $flashMessenger->addMessage('We did something in the last request');
  38. ]]>
  39. </programlisting>
  40. </listitem>
  41. <listitem>
  42. <para>
  43. 最后,大部分动作助手实现了<code>direct()</code>方法,它将调用助手的一个特定的,默认的方法。以<code>FlashMessenger</code>为例,它调用了方法<code>addMessage()</code>:
  44. </para>
  45. <programlisting role="php"><![CDATA[
  46. $this->_helper->FlashMessenger('We did something in the last request');
  47. ]]>
  48. </programlisting>
  49. </listitem>
  50. </itemizedlist>
  51. <note>
  52. <para>上面的例子在功能上是等价的。</para>
  53. </note>
  54. <para>
  55. 也可以显式的实例化助手。如果你要在动作控制器之外使用助手,或者给助手经纪人传入一个助手供所有的动作使用,你可能希望直接这么做。实例化助手和实例化其他PHP类的方法一样。
  56. </para>
  57. </sect2>
  58. <sect2 id="zend.controller.actionhelper.broker">
  59. <title>助手经纪人</title>
  60. <para>
  61. <code>Zend_Controller_Action_HelperBroker</code>处理注册助手对象和助手路径,即时的获取助手等细节。
  62. </para>
  63. <para>
  64. 使用<code>addHelper</code>来注册助手:
  65. </para>
  66. <programlisting role="php"><![CDATA[
  67. Zend_Controller_Action_HelperBroker::addHelper($helper);
  68. ]]>
  69. </programlisting>
  70. <para>
  71. 实例化助手并传入经纪人有点耗费时间和资源,不过<code>addPrefix()</code>和<code>addPath()</code>两个方法能够很容易的自动完成这些工作:
  72. </para>
  73. <itemizedlist>
  74. <listitem>
  75. <para>
  76. <code>addPrefix()</code>方法带有一个类前缀参数,用来加入自定义助手类的路径。它假定前缀遵循Zend Framework的类命名惯例。
  77. </para>
  78. <programlisting role="php"><![CDATA[
  79. // Add helpers prefixed with My_Action_Helpers in My/Action/Helpers/
  80. Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
  81. ]]>
  82. </programlisting>
  83. </listitem>
  84. <listitem>
  85. <para>
  86. <code>addPath()</code>方法第一个参数为一个目录,第二个为类前缀(默认为'Zend_Controller_Action_Helper')。用来将自己的类前缀映射到指定的目录。
  87. </para>
  88. <programlisting role="php"><![CDATA[
  89. // Add helpers prefixed with Helper in Plugins/Helpers/
  90. Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
  91. 'Helper');
  92. ]]>
  93. </programlisting>
  94. </listitem>
  95. </itemizedlist>
  96. <para>
  97. 这些方法是静态的,因而可以根据需要在控制器链中的任何位置调用动态的加载助手。
  98. </para>
  99. <para>
  100. 使用<code>hasHelper($name)</code>方法来判定助手经纪人中是否存在某助手,<code>$name</code>是助手的短名称(去掉前缀的):
  101. </para>
  102. <programlisting role="php"><![CDATA[
  103. // Check if 'redirector' helper is registered with the broker:
  104. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  105. echo 'Redirector helper registered';
  106. }
  107. ]]>
  108. </programlisting>
  109. <para>
  110. 从助手经纪人中获取助手有两个静态方法:<code>getExistingHelper()</code> 和 <code>getStaticHelper()</code> 。<code>getExistingHelper()</code>将获取助手仅当它以前调用过或者显性地通过助手经纪人注册过,否则就抛出一个异常。<code>getStaticHelper()</code> 的做法和<code>getExistingHelper()</code>一样,但如果还没有注册助手堆栈,它将尝试初始化助手,为获取你要配置的的助手,<code>getStaticHelper()</code>是一个好的选择。
  111. </para>
  112. <para>
  113. 两个方法都带一个参数,<code>$name</code>,它是助手的短名称(去掉前缀)。
  114. </para>
  115. <programlisting role="php"><![CDATA[
  116. // Check if 'redirector' helper is registered with the broker, and fetch:
  117. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  118. $redirector =
  119. Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
  120. }
  121. // Or, simply retrieve it, not worrying about whether or not it was
  122. // previously registered:
  123. $redirector =
  124. Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
  125. }
  126. ]]>
  127. </programlisting>
  128. <para>
  129. 最后,使用<code>removeHelper($name)</code>来删除助手经纪人中的某个助手,<code>$name</code>是助手的短名称。
  130. </para>
  131. <programlisting role="php"><![CDATA[
  132. // Conditionally remove the 'redirector' helper from the broker:
  133. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  134. Zend_Controller_Action_HelperBroker::removeHelper('redirector')
  135. }
  136. ]]>
  137. </programlisting>
  138. </sect2>
  139. <sect2 id="zend.controller.actionhelper.stockhelpers">
  140. <title>内建的动作助手</title>
  141. <para>
  142. Zend Framework 默认包含若干个动作助手:<code>AutoComplete</code> 自动响应 AJAX 的自动完成;<code>ContextSwitch</code> 和 <code>AjaxContext</code> 为你的动作提供替代响应格式;<code>FlashMessenger</code> 用来处理Flash Messenger会话;<code>Json</code> 用来解码和发送 JSON 响应;<code>Redirector</code> 提供另一种实现方式,帮助程序重定向到内部或者外部页面;<code>ViewRenderer</code> 自动的完成在控制器内建立视图对象并渲染视图的过程。
  143. </para>
  144. <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml" />
  145. <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml" />
  146. <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml" />
  147. <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml" />
  148. <xi:include href="Zend_Controller-ActionHelpers-Json.xml" />
  149. <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml" />
  150. <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml" />
  151. </sect2>
  152. <sect2 id="zend.controller.actionhelper.writingyourown">
  153. <title>编写自己的助手</title>
  154. <para>
  155. 动作助手继承抽象类<code>Zend_Controller_Action_Helper_Abstract</code>,该类提供了助手经纪人要求的基本接口和功能,包含下列方法:
  156. </para>
  157. <itemizedlist>
  158. <listitem>
  159. <para>
  160. <code>setActionController()</code> 用来设置当前的动作控制器。
  161. </para>
  162. </listitem>
  163. <listitem>
  164. <para>
  165. <code>init()</code>,该方法在实例化时由助手经纪人触发,可用来触发助手的初始化过程;动作链中多个控制器使用相同的助手时,如要恢复状态时将十分有用。
  166. </para>
  167. </listitem>
  168. <listitem>
  169. <para>
  170. <code>preDispatch()</code>分发动作之前触发。
  171. </para>
  172. </listitem>
  173. <listitem>
  174. <para>
  175. <code>postDispatch()</code>分发过程结束时触发——即使<code>preDispatch()</code>插件已经跳过了该动作。清理时大量使用。
  176. </para>
  177. </listitem>
  178. <listitem>
  179. <para>
  180. <code>getRequest()</code> 获取当前的请求对象。
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. <code>getResponse()</code> 获取当前的响应对象。
  186. </para>
  187. </listitem>
  188. <listitem>
  189. <para>
  190. <code>getName()</code> 获取助手名。获取了下划线后面的类名部分,没有下划线则获取类的全名。例如,如果类名为<code>Zend_Controller_Action_Helper_Redirector</code>,他将返回 <code>Redirector</code>,如果类名为<code>FooMessage</code>,将会返回全名。
  191. </para>
  192. </listitem>
  193. </itemizedlist>
  194. <para>
  195. 助手类中还可以包含一个<code>direct()</code>方法,如果定义了该方法,就可以将助手视作助手经纪人的一个方法,以便简单的、一次性的使用助手。例如<link linkend="zend.controller.actionhelpers.redirector">redirector</link> 定义<code>direct()</code> 作为<code>goto()</code>的别名,就可以这样使用:
  196. </para>
  197. <programlisting role="php"><![CDATA[
  198. // Redirect to /blog/view/item/id/42
  199. $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
  200. ]]>
  201. </programlisting>
  202. <para>
  203. 在内部,助手经纪人的<code>__call()</code>方法先寻找名叫<code>redirector</code>的助手,然后检查该助手的<code>direct</code>方法是否定义,然后使用所提供的参数来调用该方法。
  204. </para>
  205. <para>
  206. 如果创建了自己的助手,可以按照前面章节所述的提供相应的访问方法。
  207. </para>
  208. </sect2>
  209. </sect1>
  210. <!--
  211. vim:se ts=4 sw=4 et:
  212. -->