Zend_Controller-Plugins.xml 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.plugins" xmlns:xi="http://www.w3.org/2001/XInclude">
  5. <title>Plugins</title>
  6. <sect2 id="zend.controller.plugins.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Die Controller Architektur beinhaltet ein Pluginsystem, das den Aufruf von Anwendercode
  10. ermöglicht, wenn bestimmte Ereignisse im Controller Prozess auftreten. Der Front
  11. Controller verwendet einen Plugin Broker als eine Registry für User Plugins und der
  12. Plugin Broker stellt sicher, dass die Ereignismethoden von jedem Plugin aufgerufen
  13. werden, die im Front Controller registriert worden sind.
  14. </para>
  15. <para>
  16. Die Ereignismethoden sind in der abstrakten Klasse
  17. <classname>Zend_Controller_Plugin_Abstract</classname> definiert, von dem User Plugin Klassen
  18. angeleitet werden müssen:
  19. </para>
  20. <itemizedlist>
  21. <listitem>
  22. <para>
  23. <code>routeStartup()</code> wird aufgerufen bevor
  24. <classname>Zend_Controller_Front</classname> <link
  25. linkend="zend.controller.router">den Router</link>
  26. aufruft, um den Request anhand der registrierten Routen zu überprüfen.
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. <code>routeShutdown()</code> wird aufgerufen, nachdem <link
  32. linkend="zend.controller.router">der Router</link>
  33. das Routing der Anfrage beendet.
  34. </para>
  35. </listitem>
  36. <listitem>
  37. <para>
  38. <code>dispatchLoopStartup()</code> wird aufgerufen, bevor
  39. <classname>Zend_Controller_Front</classname> den Dispatch Loop aufnimmt.
  40. </para>
  41. </listitem>
  42. <listitem>
  43. <para>
  44. <code>preDispatch()</code> wird von
  45. <link linkend="zend.controller.dispatcher">dem Dispatcher</link>
  46. aufgerufen, bevor eine Aktion verarbeitet wird. Dieser Callback erlaubt ein
  47. Proxy oder Filter Verhalten. Durch Verändern des Requests und Zurücksetzen
  48. des Verarbeitungsstatus (mittels
  49. <classname>Zend_Controller_Request_Abstract::setDispatched(false)</classname>) kann
  50. die aktuelle Aktion abgebrochen oder ersetzt werden.
  51. </para>
  52. </listitem>
  53. <listitem>
  54. <para>
  55. <code>postDispatch()</code> wird von
  56. <link linkend="zend.controller.dispatcher">dem Dispatcher</link>
  57. aufgerufen, nachdem eine Aktion verarbeitet wurde. Dieser Callback erlaubt ein
  58. Proxy oder Filter Verhalten. Durch Verändern des Requests und Zurücksetzen
  59. des Verarbeitungsstatus (mittels
  60. <classname>Zend_Controller_Request_Abstract::setDispatched(false)</classname>) kann
  61. eine neue Aktion für die Verarbeitung angegeben werden.
  62. </para>
  63. </listitem>
  64. <listitem>
  65. <para>
  66. <code>dispatchLoopShutdown()</code> wird aufgerufen, nachdem
  67. <classname>Zend_Controller_Front</classname> den Dispatch Loop beendet.
  68. </para>
  69. </listitem>
  70. </itemizedlist>
  71. </sect2>
  72. <sect2 id="zend.controller.plugins.writing">
  73. <title>Plugins schreiben</title>
  74. <para>
  75. Um eine Plugin Klasse zu schreiben, bindet man einfach die abstrakte Klasse
  76. <classname>Zend_Controller_Plugin_Abstract</classname> ein und erweitert sie:
  77. </para>
  78. <programlisting role="php"><![CDATA[
  79. class MyPlugin extends Zend_Controller_Plugin_Abstract
  80. {
  81. // ...
  82. }
  83. ]]></programlisting>
  84. <para>
  85. Keine der Methoden von <classname>Zend_Controller_Plugin_Abstract</classname> ist abstrakt, so
  86. dass Plugin Klassen nicht gezwungen werden, irgend einen der vorhandenen
  87. Ereignismethoden zu implemetieren, die oben gelistet wurden. Schreiber von Plugins
  88. brauchen nur die Methoden zu implementieren, die sie für ihre speziellen Bedürfnisse
  89. benötigen.
  90. </para>
  91. <para>
  92. <classname>Zend_Controller_Plugin_Abstract</classname> stellt den Controller Plugins außerdem die
  93. Request und Response Objekte über die <code>getRequest()</code> und
  94. <code>getResponse()</code> Methoden zur Verfügung.
  95. </para>
  96. </sect2>
  97. <sect2 id="zend.controller.plugins.using">
  98. <title>Plugins verwenden</title>
  99. <para>
  100. Plugin Klassen werden mit <classname>Zend_Controller_Front::registerPlugin()</classname>
  101. registriert und können jederzeit registriert werden. Der folgende Schnipsel zeigt,
  102. wie ein Plugin in der Controllerkette verwendet werden kann:
  103. </para>
  104. <programlisting role="php"><![CDATA[
  105. class MyPlugin extends Zend_Controller_Plugin_Abstract
  106. {
  107. public function routeStartup(Zend_Controller_Request_Abstract $request)
  108. {
  109. $this->getResponse()
  110. ->appendBody("<p>routeStartup() called</p>\n");
  111. }
  112. public function routeShutdown(Zend_Controller_Request_Abstract $request)
  113. {
  114. $this->getResponse()
  115. ->appendBody("<p>routeShutdown() called</p>\n");
  116. }
  117. public function dispatchLoopStartup(
  118. Zend_Controller_Request_Abstract $request)
  119. {
  120. $this->getResponse()
  121. ->appendBody("<p>dispatchLoopStartup() called</p>\n");
  122. }
  123. public function preDispatch(Zend_Controller_Request_Abstract $request)
  124. {
  125. $this->getResponse()
  126. ->appendBody("<p>preDispatch() called</p>\n");
  127. }
  128. public function postDispatch(Zend_Controller_Request_Abstract $request)
  129. {
  130. $this->getResponse()
  131. ->appendBody("<p>postDispatch() called</p>\n");
  132. }
  133. public function dispatchLoopShutdown()
  134. {
  135. $this->getResponse()
  136. ->appendBody("<p>dispatchLoopShutdown() called</p>\n");
  137. }
  138. }
  139. $front = Zend_Controller_Front::getInstance();
  140. $front->setControllerDirectory('/path/to/controllers')
  141. ->setRouter(new Zend_Controller_Router_Rewrite())
  142. ->registerPlugin(new MyPlugin());
  143. $front->dispatch();
  144. ]]></programlisting>
  145. <para>
  146. Angenommen das keine der Aktionen igendeine Ausgabe produzieren, und nur eine Aktion aufgerufen wurde,
  147. dann erzeugt die Funktionalität des obigen Plugins trotzdem die folgende Ausgabe:
  148. </para>
  149. <programlisting role="php"><![CDATA[
  150. <p>routeStartup() aufgerufen</p>
  151. <p>routeShutdown() aufgerufen</p>
  152. <p>dispatchLoopStartup() aufgerufen</p>
  153. <p>preDispatch() aufgerufen</p>
  154. <p>postDispatch() aufgerufen</p>
  155. <p>dispatchLoopShutdown() aufgerufen</p>
  156. ]]></programlisting>
  157. <note>
  158. <para>
  159. Plugins können jederzeit wärend der Ausführung des Frontkontrollers registriert werden. Wenn
  160. trotzdem ein Event ausgeführt wurde für das das Plugin eine registrierte Eventmethode enthält,
  161. wird diese Methode nicht getriggert.
  162. </para>
  163. </note>
  164. </sect2>
  165. <sect2 id="zend.controller.plugins.manipulating">
  166. <title>Empfangen und Manipulieren von Plugins</title>
  167. <para>
  168. Fallweise kann es notwendig sein ein Plugin zu entfernen oder empfangen. Die folgenden Methoden des
  169. Frontkontrollers erlauben dies:
  170. </para>
  171. <itemizedlist>
  172. <listitem><para>
  173. <code>getPlugin($class)</code> erlaubt es ein Plugin durch den Klassennamen zu empfangen. Wenn
  174. kein Plugin entspricht, wird false zurückgegeben. Wenn mehr als ein Plugin dieser Klasse
  175. registriert ist, wird ein Array zurückgegeben.
  176. </para></listitem>
  177. <listitem><para>
  178. <code>getPlugins()</code> empfängt den kompletten Plugin Stack.
  179. </para></listitem>
  180. <listitem><para>
  181. <code>unregisterPlugin($plugin)</code> erlaubt die Entfernung eines Plugins vom Stack. Es kann
  182. ein Plugin Objekt oder der Klassenname des Plugins, das entfernt werden soll, übergeben werden.
  183. Wenn der Klassenname übergeben wird, wird jedes Plugin dieser Klasse entfernt.
  184. </para></listitem>
  185. </itemizedlist>
  186. </sect2>
  187. <sect2 id="zend.controller.plugins.standard">
  188. <title>Plugins die in der Standard Distribution enthalten sind</title>
  189. <para>
  190. Zend Framework enthält ein Plugin für die Fehlerbehandlung in der Standard Distribution.
  191. </para>
  192. <xi:include href="Zend_Controller-Plugins-ActionStack.xml" />
  193. <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml" />
  194. </sect2>
  195. </sect1>
  196. <!--
  197. vim:se ts=4 sw=4 et:
  198. -->