Zend_Controller-ActionHelpers.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
  5. <title>Action Helfer</title>
  6. <sect2 id="zend.controller.actionhelper.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Aktion Helfer erlauben Entwicklern Runtime und/oder On-Demand Funktionalität in jeden Aktion Kontroller
  10. zu inizieren der <classname>Zend_Controller_Action</classname> erweitert. Aktion Kontroller versuchen den Notwendigkeit zu
  11. minimieren, den abstrakten Aktion Kontroller zu erweitern um damit normale Aktion Kontroller
  12. Funktionen inizieren.
  13. </para>
  14. <para>
  15. Es gibt eine Menge an Wegen um Aktion Helfer zu verwenden. Aktion Helfer verwenden ein Broker System,
  16. ähnlich den Typen von Brokern in <link linkend="zend.view.helpers">Zend_View_Helper</link>, und
  17. denen von <link linkend="zend.controller.plugins">Zend_Controller_Plugin</link>. Aktion Helfer
  18. (wie <classname>Zend_View_Helper</classname>) können bei Bedarf geladen und aufgerufen werden, oder Sie können
  19. wärend der Anfragezeit (Bootstrap) instanziert werden oder wären der Erstellungszeit des
  20. Aktion Kontrollers (init()). Um Sie näher zu verstehen, betrachten wir Ihre Verwendung in der
  21. folgenden Sektion.
  22. </para>
  23. </sect2>
  24. <sect2 id="zend.controller.actionhelper.initialization">
  25. <title>Helfer Initialisierung</title>
  26. <para>
  27. Ein Helfer kann auf vielen verschiedenen Wegen initialisiert werden, basierend auf den eigenen
  28. Bedürfnissen und den Funktionalitäten dieses Helfers.
  29. </para>
  30. <para>
  31. Ein Helfer Broker wir das der <code>$_helper</code> Teilnehmer von <classname>Zend_Controller_Action</classname>
  32. gespeichert; der Broker kann verwendet werden um Helfer zu empfangen oder aufzurufen. Einige Methoden
  33. das zu tun sind:
  34. </para>
  35. <itemizedlist>
  36. <listitem>
  37. <para>
  38. Explizit <code>getHelper()</code> verwenden. Ihm einfach einen Namen übergeben und ein
  39. Helfer Objekt wird zurückgegeben:
  40. </para>
  41. <programlisting role="php"><![CDATA[
  42. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
  43. $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
  44. ]]>
  45. </programlisting>
  46. </listitem>
  47. <listitem>
  48. <para>
  49. Verwenden der <code>__get()</code> Funktionalität des Helfer Brokers und empfangen des Helfers
  50. wie wenn er eine Teilnehmer Eigenschaft des Brokers wäre:
  51. </para>
  52. <programlisting role="php"><![CDATA[
  53. $flashMessenger = $this->_helper->FlashMessenger;
  54. $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
  55. ]]>
  56. </programlisting>
  57. </listitem>
  58. <listitem>
  59. <para>
  60. Letztendlich implmentieren die meisten Aktion Helfer die <code>direct()</code> Methode welche
  61. eine spezielle, Standardmethode im Helfer aufruft. In Beispiel des <code>FlashMessenger</code>s,
  62. wird <code>addMessage()</code> aufgerufen:
  63. </para>
  64. <programlisting role="php"><![CDATA[
  65. $this->_helper->FlashMessenger('Wir haben in der letzten Anfrage etwas getan');
  66. ]]>
  67. </programlisting>
  68. </listitem>
  69. </itemizedlist>
  70. <note>
  71. <para>Alle oben angeführten Beispiel sind funktionell gleichwertig.</para>
  72. </note>
  73. <para>
  74. Man kann Helfer auch explizit instanzieren. Das kann gewollt sein wenn der Helfer ausserhalb eines
  75. Aktion Kontrollers verwendet werden soll, oder wenn ein Helfer an einen Helfer Broker übergeben wird
  76. um Ihn durch irgendeine Aktion zu verwenden. Instanziert wird er wie jede andere PHP Klasse.
  77. </para>
  78. </sect2>
  79. <sect2 id="zend.controller.actionhelper.broker">
  80. <title>Der Helfer Broker</title>
  81. <para>
  82. <classname>Zend_Controller_Action_HelperBroker</classname> behandelt die Details der Registrierung von Helfer
  83. Objekten und Helfer Pfaden, sowie dem Empfangen von Helfern bei Befarf.
  84. </para>
  85. <para>
  86. Um einen Helfer im Browser zu registrieren, kann <code>addHelper</code> verwendet werden:
  87. </para>
  88. <programlisting role="php"><![CDATA[
  89. Zend_Controller_Action_HelperBroker::addHelper($helper);
  90. ]]>
  91. </programlisting>
  92. <para>
  93. Natürlich ist das Instanzieren und übergeben von Helfern an den Broker etwas Zeit- und Ressourcen
  94. intensiv, weswegen twei Methoden existieren um die Dinge etwas zu automatisieren:
  95. <code>addPrefix()</code> und <code>addPath()</code>.
  96. </para>
  97. <itemizedlist>
  98. <listitem>
  99. <para>
  100. <code>addPrefix()</code> nimmt einen Klassenprefix und verwendet Ihn um einen Pfad zu
  101. ermitteln wo Helferklassen definiert wurden. Er nimmt an das der Prefix den Konventionen der
  102. Benamung von Klassen im Zend Frameworks folgt.
  103. </para>
  104. <programlisting role="php"><![CDATA[
  105. // Helfer mit vorangestelltem My_Action_Helpers in My/Action/Helpers/ hinzufügen
  106. Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
  107. ]]>
  108. </programlisting>
  109. </listitem>
  110. <listitem>
  111. <para>
  112. <code>addPath()</code> nimmt ein Verzeichnis als erstes Argument und einen Klassenprefix als
  113. zweites Argument (Standardwert ist 'Zend_Controller_Action_Helper'). Das erlaubt es
  114. die eigenen Klassenprefixes mit speziellen Verzeichnissen zu verbinden.
  115. </para>
  116. <programlisting role="php"><![CDATA[
  117. // Helfer mit vorangestelltem Helper in Plugins/Helpers/ hinzufügen
  118. Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
  119. 'Helper');
  120. ]]>
  121. </programlisting>
  122. </listitem>
  123. </itemizedlist>
  124. <para>
  125. Da diese Methoden statisch sind, können Sie zu jeder Zeit in der Kontrollerkette aufgerufen werden um
  126. Helfer dynamisch hinzuzufügen wenn es notwendig wird.
  127. </para>
  128. <para>
  129. Intern verwendet der Helfer Broker <link linkend="zend.loader.pluginloader">eine Instanz des
  130. PluginLoader's</link> um die Pfade zu verwalten. Man erhlt den PluginLoader indem die statische
  131. Methode <code>getPluginLoader()</code> verwendet, oder alternativ, eine eigene PluginLoader
  132. Instanz einfügt durch Verwenden von <code>setPluginLoader()</code>.
  133. </para>
  134. <para>
  135. Um zu ermitteln ob ein Helfer im Helfer Broker existiert, kann <code>hasHelper($name)</code> verwendet
  136. werden, wobei <code>$name</code> der Kurzname des Helfers ist (ohne das Prefix):
  137. </para>
  138. <programlisting role="php"><![CDATA[
  139. // Prüft ob der 'redirector' Helfer im Broker registriert ist:
  140. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  141. echo 'Der Redirector Helfer ist registriert';
  142. }
  143. ]]>
  144. </programlisting>
  145. <para>
  146. Es gibt auch zwei statische Methoden für das bekommen von Helfern vom Helferbroker:
  147. <code>getExistingHelper()</code> und <code>getStaticHelper()</code>. <code>getExistingHelper()</code>
  148. empfängt einen Helfer nur dann wenn er davor durch den Helferbroker ausgerufen wirde oder explizit
  149. in Ihm registriert wurde; wenn nicht wird eine Ausnahme geworfen. <code>getStaticHelper()</code>
  150. macht das selbe wie <code>getExistingHelper()</code>, wird aber versuchen den Helfer zu
  151. initiieren wenn dieser davor noch nicht im Helferstack registriert wurde.
  152. <code>getStaticHelper()</code> ist eine gute Wahl für das empfangen von Helfern welche man
  153. konfigurieren will.
  154. </para>
  155. <para>
  156. Beide Methoden nehmen ein einzelnes Argument, <code>$name</code>, welches der Kurzname des
  157. Helfers (ohne den Präfix) ist.
  158. </para>
  159. <programlisting role="php"><![CDATA[
  160. // Prüfe ob der 'redirector' Helfer im Broker registriert ist und holt Ihn:
  161. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  162. $redirector =
  163. Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
  164. }
  165. // Oder, Ihn einfach empfangen, ohne darüber nachzudenken ob er bereits
  166. // registriert wurde oder nicht:
  167. $redirector =
  168. Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
  169. }
  170. ]]>
  171. </programlisting>
  172. <para>
  173. Schlußendlich, um einen registrierten Helfer vom Broker zu entfernen, kann
  174. <code>removeHelper($name)</code> verwendet werden, wobei <code>$name</code> der Kurzname des Helfers
  175. ist (ohne den Prefix):
  176. </para>
  177. <programlisting role="php"><![CDATA[
  178. // Wenn vorhanden, entferne den 'redirector' Helfer vom Broker:
  179. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  180. Zend_Controller_Action_HelperBroker::removeHelper('redirector')
  181. }
  182. ]]>
  183. </programlisting>
  184. </sect2>
  185. <sect2 id="zend.controller.actionhelper.stockhelpers">
  186. <title>Eingebaute Aktions Helfer</title>
  187. <para>
  188. Zend Framework enthält standardmäßig verschiedene Action Helfer:
  189. <code>AutoComplete</code> für automatisierte Antworten für AJAX Autovervollständigung;
  190. <code>ContextSwitch</code> und <code>AjaxContext</code> für alternative Antwort Formate
  191. eigener Aktionen; einen <code>FlashMessenger</code> für die Behandlung von
  192. Kurznachrichten; <code>Json</code> für das verschlüsseln und senden von JSON Antworten;
  193. einen <code>Redirector</code>, um verschiedene Implementationen, für das Umleiten zu
  194. internen und externen Seiten, für die Anwendung bereitzustellen und einen
  195. <code>ViewRenderer</code> um den Prozess des Setzens eines View Objekts im Kontroller
  196. und dem Rendern von Views zu automatisieren.
  197. </para>
  198. <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml" />
  199. <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml" />
  200. <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml" />
  201. <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml" />
  202. <xi:include href="Zend_Controller-ActionHelpers-Json.xml" />
  203. <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml" />
  204. <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml" />
  205. </sect2>
  206. <sect2 id="zend.controller.actionhelper.writingyourown">
  207. <title>Schreiben eigener Helfer</title>
  208. <para>
  209. Aktions Helfer erweitern <classname>Zend_Controller_Action_Helper_Abstract</classname>, eine abstrakte Klasse die
  210. das Basisinterface bietet und vom Helfer Broker funktionell benötigt wird. Diese inkludiert die folgenden
  211. Methoden:
  212. </para>
  213. <itemizedlist>
  214. <listitem>
  215. <para>
  216. <code>setActionController()</code> wird verwendet um den aktuellen Aktion Kontroller zu setzen.
  217. </para>
  218. </listitem>
  219. <listitem>
  220. <para>
  221. <code>init()</code>, wird vom Helfer Broker wärend der Instanzierung ausgeführt und kann
  222. verwendet werden um den Status zu resetieren wenn mehrere Kontroller den gleichen Helfer in
  223. einer verketteten Aktion verwenden.
  224. </para>
  225. </listitem>
  226. <listitem>
  227. <para>
  228. <code>preDispatch()</code>, wird vor der ausführenden Aktion gestartet.
  229. </para>
  230. </listitem>
  231. <listitem>
  232. <para>
  233. <code>postDispatch()</code> wird ausgeführt nachdem eine Aktion fertig ist -- selbst wenn ein
  234. <code>preDispatch()</code> Plugin die Aktion abgebrochen hat. Normalerweise nützlich für
  235. das Saubermachen.
  236. </para>
  237. </listitem>
  238. <listitem>
  239. <para>
  240. <code>getRequest()</code> empfängt das aktuelle Anfrage Objekt.
  241. </para>
  242. </listitem>
  243. <listitem>
  244. <para>
  245. <code>getResponse()</code> empfängt das aktuelle Antwort Objekt.
  246. </para>
  247. </listitem>
  248. <listitem>
  249. <para>
  250. <code>getName()</code> empfängt den Helfernamen. Sie empfängt die Portion des Klassennamens der
  251. dem letzten Unterstrich-Zeichen folgt, oder andererseits den kompletten Klassennamen. Als
  252. Beispiel, wenn die Klasse <classname>Zend_Controller_Action_Helper_Redirector</classname> heißt, wird
  253. <code>Redirector</code> zurückgegeben; eine Klasse die <code>FooMessage</code> heißt wird
  254. einfach sich selbst zurückgeben.
  255. </para>
  256. </listitem>
  257. </itemizedlist>
  258. <para>
  259. Optional kann eine <code>direct()</code> Methode in der eigenen Helfer Klasse inkludiert werden. Wenn Sie
  260. definiert ist, erlaubt Sie den Helfer als eine Methode des Helfer Brokers zu verwenden, um eine einfache
  261. rein-raus Verwendung des Helfers zu ermöglichen. Als Beispiel definiert der
  262. <link linkend="zend.controller.actionhelpers.redirector">Umleiter</link> <code>direct()</code> als
  263. einen Alias von <code>goto()</code> und erlaubt damit die Verwendung des Helfers wie folgt:
  264. </para>
  265. <programlisting role="php"><![CDATA[
  266. // Umleiten zu /blog/view/item/id/42
  267. $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
  268. ]]>
  269. </programlisting>
  270. <para>
  271. Intern schaut die <code>__call()</code> Methode des Helfer Brokers nach einem Helfer der
  272. <code>redirector</code> heißt, prüft anschließend ob der Helfer eine definierte <code>direct</code>
  273. Klasse besitzt und ruft diese mit den angegebenen Argumenten auf.
  274. </para>
  275. <para>
  276. Wenn eine eigene Helfer Klasse erstellt wurde, kann man zu Ihr wie im obigen Kapitel beschrieben,
  277. Zugang erhalten.
  278. </para>
  279. </sect2>
  280. </sect1>
  281. <!--
  282. vim:se ts=4 sw=4 et:
  283. -->