Zend_Controller-ActionHelpers.xml 15 KB

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