2
0

Zend_Controller-Plugins.xml 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  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
  18. Klassen angeleitet werden müssen:
  19. </para>
  20. <itemizedlist>
  21. <listitem>
  22. <para>
  23. <methodname>routeStartup()</methodname> 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. <methodname>routeShutdown()</methodname> 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. <methodname>dispatchLoopStartup()</methodname> wird aufgerufen, bevor
  39. <classname>Zend_Controller_Front</classname> den Dispatch Loop aufnimmt.
  40. </para>
  41. </listitem>
  42. <listitem>
  43. <para>
  44. <methodname>preDispatch()</methodname> 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. <methodname>Zend_Controller_Request_Abstract::setDispatched(false)</methodname>)
  50. kann die aktuelle Aktion abgebrochen oder ersetzt werden.
  51. </para>
  52. </listitem>
  53. <listitem>
  54. <para>
  55. <methodname>postDispatch()</methodname> 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. <methodname>Zend_Controller_Request_Abstract::setDispatched(false)</methodname>)
  61. kann eine neue Aktion für die Verarbeitung angegeben werden.
  62. </para>
  63. </listitem>
  64. <listitem>
  65. <para>
  66. <methodname>dispatchLoopShutdown()</methodname> 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 language="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
  86. abstrakt, so 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
  93. außerdem die Request und Response Objekte über die
  94. <methodname>getRequest()</methodname> und <methodname>getResponse()</methodname>
  95. Methoden zur Verfügung.
  96. </para>
  97. </sect2>
  98. <sect2 id="zend.controller.plugins.using">
  99. <title>Plugins verwenden</title>
  100. <para>
  101. Plugin Klassen werden mit
  102. <methodname>Zend_Controller_Front::registerPlugin()</methodname> registriert und können
  103. jederzeit registriert werden. Der folgende Schnipsel zeigt, wie ein Plugin in der
  104. Controllerkette verwendet werden kann:
  105. </para>
  106. <programlisting language="php"><![CDATA[
  107. class MyPlugin extends Zend_Controller_Plugin_Abstract
  108. {
  109. public function routeStartup(Zend_Controller_Request_Abstract $request)
  110. {
  111. $this->getResponse()
  112. ->appendBody("<p>routeStartup() called</p>\n");
  113. }
  114. public function routeShutdown(Zend_Controller_Request_Abstract $request)
  115. {
  116. $this->getResponse()
  117. ->appendBody("<p>routeShutdown() called</p>\n");
  118. }
  119. public function dispatchLoopStartup(
  120. Zend_Controller_Request_Abstract $request)
  121. {
  122. $this->getResponse()
  123. ->appendBody("<p>dispatchLoopStartup() called</p>\n");
  124. }
  125. public function preDispatch(Zend_Controller_Request_Abstract $request)
  126. {
  127. $this->getResponse()
  128. ->appendBody("<p>preDispatch() called</p>\n");
  129. }
  130. public function postDispatch(Zend_Controller_Request_Abstract $request)
  131. {
  132. $this->getResponse()
  133. ->appendBody("<p>postDispatch() called</p>\n");
  134. }
  135. public function dispatchLoopShutdown()
  136. {
  137. $this->getResponse()
  138. ->appendBody("<p>dispatchLoopShutdown() called</p>\n");
  139. }
  140. }
  141. $front = Zend_Controller_Front::getInstance();
  142. $front->setControllerDirectory('/path/to/controllers')
  143. ->setRouter(new Zend_Controller_Router_Rewrite())
  144. ->registerPlugin(new MyPlugin());
  145. $front->dispatch();
  146. ]]></programlisting>
  147. <para>
  148. Angenommen das keine der Aktionen igendeine Ausgabe produzieren, und nur eine Aktion
  149. aufgerufen wurde, dann erzeugt die Funktionalität des obigen Plugins trotzdem die
  150. folgende Ausgabe:
  151. </para>
  152. <programlisting language="php"><![CDATA[
  153. <p>routeStartup() aufgerufen</p>
  154. <p>routeShutdown() aufgerufen</p>
  155. <p>dispatchLoopStartup() aufgerufen</p>
  156. <p>preDispatch() aufgerufen</p>
  157. <p>postDispatch() aufgerufen</p>
  158. <p>dispatchLoopShutdown() aufgerufen</p>
  159. ]]></programlisting>
  160. <note>
  161. <para>
  162. Plugins können jederzeit während der Ausführung des Frontcontrollers registriert
  163. werden. Wenn trotzdem ein Event ausgeführt wurde für dass das Plugin eine
  164. registrierte Eventmethode enthält, wird diese Methode nicht getriggert.
  165. </para>
  166. </note>
  167. </sect2>
  168. <sect2 id="zend.controller.plugins.manipulating">
  169. <title>Empfangen und Manipulieren von Plugins</title>
  170. <para>
  171. Fallweise kann es notwendig sein ein Plugin zu entfernen oder empfangen. Die folgenden
  172. Methoden des Frontcontrollers erlauben dies:
  173. </para>
  174. <itemizedlist>
  175. <listitem>
  176. <para>
  177. <methodname>getPlugin($class)</methodname> erlaubt es ein Plugin durch den
  178. Klassennamen zu empfangen. Wenn kein Plugin entspricht, wird
  179. <constant>FALSE</constant> zurückgegeben. Wenn mehr als ein Plugin dieser
  180. Klasse registriert ist, wird ein Array zurückgegeben.
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. <methodname>getPlugins()</methodname> empfängt den kompletten Plugin Stack.
  186. </para>
  187. </listitem>
  188. <listitem>
  189. <para>
  190. <methodname>unregisterPlugin($plugin)</methodname> erlaubt die Entfernung eines
  191. Plugins vom Stack. Es kann ein Plugin Objekt oder der Klassenname des Plugins,
  192. das entfernt werden soll, übergeben werden. Wenn der Klassenname übergeben
  193. wird, wird jedes Plugin dieser Klasse entfernt.
  194. </para>
  195. </listitem>
  196. </itemizedlist>
  197. </sect2>
  198. <sect2 id="zend.controller.plugins.standard">
  199. <title>Plugins die in der Standard Distribution enthalten sind</title>
  200. <para>
  201. Zend Framework enthält ein Plugin für die Fehlerbehandlung in der Standard Distribution.
  202. </para>
  203. <xi:include href="Zend_Controller-Plugins-ActionStack.xml" />
  204. <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml" />
  205. <xi:include href="Zend_Controller-Plugins-PutHandler.xml" />
  206. </sect2>
  207. </sect1>