Zend_Controller-ActionHelpers.xml 15 KB

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