Zend_Controller-Plugins.xml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <sect1 id="zend.controller.plugins" xmlns:xi="http://www.w3.org/2001/XInclude">
  2. <title>Wtyczki</title>
  3. <sect2 id="zend.controller.plugins.introduction">
  4. <title>Wprowadzenie</title>
  5. <para>
  6. Architektura kontrolera zawiera także system wtyczek, który pozwala
  7. programiście na wykonanie własnego kodu, gdy następują określone
  8. zdarzenia w trakcie trwania procesu kontrolera. Kontroler frontowy
  9. używa agenta wtyczek jako rejeestru dla wtyczek programisty,
  10. a agent wtyczek jest odpowiedzialny za to, że metody zdarzeń są
  11. wywoływane dla każdej wtyczki zarejestrowanej w kontrolerze
  12. frontowym.
  13. </para>
  14. <para>
  15. Metody zdarzeń są zdefiniowane w klasie abstrakcyjnej
  16. <code>Zend_Controller_Plugin_Abstract</code>, z której dziedziczy
  17. każda klasa wtyczki:
  18. </para>
  19. <itemizedlist>
  20. <listitem>
  21. <para>
  22. Metoda <code>routeStartup()</code> jest wywoływana zanim
  23. <code>Zend_Controller_Front</code> wywoła <link
  24. linkend="zend.controller.router">router</link> w celu
  25. sprawdzenia żądania pod kątem zarejestrowanych tras.
  26. </para>
  27. </listitem>
  28. <listitem>
  29. <para>
  30. Metoda <code>routeShutdown()</code> jest wywoływana po tym
  31. jak <link linkend="zend.controller.router">router</link>
  32. zakończy routing żądania.
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. Metoda <code>dispatchLoopStartup()</code> jest uruchamiana
  38. zanim <code>Zend_Controller_Front</code> zacznie pętlę
  39. uruchamiania.
  40. </para>
  41. </listitem>
  42. <listitem>
  43. <para>
  44. Metoda <code>preDispatch()</code> jest wywoływana zanim
  45. akcja zostanie uruchomiona przez
  46. <link linkend="zend.controller.dispatcher">obiekt
  47. uruchamiający</link>. Pozwala to na stworzenie
  48. funkcjonalności proxy lub filtra. Nadpisując żądanie i
  49. resetując flagę uruchomienia (za pomocą
  50. <code>Zend_Controller_Request_Abstract::setDispatched(false)</code>),
  51. obecna akcja może być pominięta lub zastąpiona.
  52. </para>
  53. </listitem>
  54. <listitem>
  55. <para>
  56. <code>postDispatch()</code> jest wywoływana po tym jak akcja
  57. zostanie uruchomiona przez
  58. <link linkend="zend.controller.dispatcher">obiekt
  59. uruchamiający</link>. Pozwala to na stworzenie
  60. funkcjonalności proxy lub filtra. Nadpisując żądanie i
  61. resetując flagę uruchomienia (za pomocą
  62. <code>Zend_Controller_Request_Abstract::setDispatched(false)</code>),
  63. można określić nową akcję do uruchomienia.
  64. </para>
  65. </listitem>
  66. <listitem>
  67. <para>
  68. Metoda <code>dispatchLoopShutdown()</code> jest wywoływana
  69. po tym jak <code>Zend_Controller_Front</code> zakończy
  70. pętlę uruchamiania.
  71. </para>
  72. </listitem>
  73. </itemizedlist>
  74. </sect2>
  75. <sect2 id="zend.controller.plugins.writing">
  76. <title>Pisanie wtyczek</title>
  77. <para>
  78. W celu napisania klasy wtyczki, w prosty sposób rozszerz klasę
  79. abstrakcyjną <code>Zend_Controller_Plugin_Abstract</code>:
  80. </para>
  81. <programlisting role="php"><![CDATA[
  82. class MyPlugin extends Zend_Controller_Plugin_Abstract
  83. {
  84. // ...
  85. }
  86. ]]>
  87. </programlisting>
  88. <para>
  89. Żadna z metod klasy <code>Zend_Controller_Plugin_Abstract</code> nie
  90. jest abstrakcyjna, co oznacza, że nie jest konieczne implementowanie
  91. wszystkich dostępnych metod zdarzeń opisanych powyżej. Autor wtyczki
  92. może zaimplementować tylko te metody zdarzeń, które są mu
  93. rzeczywiście potrzebne.
  94. </para>
  95. <para>
  96. <code>Zend_Controller_Plugin_Abstract</code> udostępnia także
  97. obiekty żądania i odpowiedzi wtyczkom kontrolera za pomocą metod
  98. <code>getRequest()</code> oraz <code>getResponse()</code>, odpowiednio.
  99. </para>
  100. </sect2>
  101. <sect2 id="zend.controller.plugins.using">
  102. <title>Użycie wtyczek</title>
  103. <para>
  104. Klasy wtyczek są rejestrowane za pomocą metody
  105. <code>Zend_Controller_Front::registerPlugin()</code> i mogą być
  106. rejestrowane w dowolnym momencie. Poniższy kod pokazuje w jaki
  107. sposób wtyczka może być użyta przez kontroler:
  108. </para>
  109. <programlisting role="php"><![CDATA[
  110. class MyPlugin extends Zend_Controller_Plugin_Abstract
  111. {
  112. public function routeStartup(Zend_Controller_Request_Abstract $request)
  113. {
  114. $this->getResponse()->appendBody("<p>Wywołano metodę routeStartup()</p>\n");
  115. }
  116. public function routeShutdown(Zend_Controller_Request_Abstract $request)
  117. {
  118. $this->getResponse()->appendBody("<p>Wywołano metodę routeShutdown()</p>\n");
  119. }
  120. public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
  121. {
  122. $this->getResponse()->appendBody("<p>Wywołano metodę dispatchLoopStartup()</p>\n");
  123. }
  124. public function preDispatch(Zend_Controller_Request_Abstract $request)
  125. {
  126. $this->getResponse()->appendBody("<p>Wywołano metodę preDispatch()</p>\n");
  127. }
  128. public function postDispatch(Zend_Controller_Request_Abstract $request)
  129. {
  130. $this->getResponse()->appendBody("<p>Wywołano metodę postDispatch()</p>\n");
  131. }
  132. public function dispatchLoopShutdown()
  133. {
  134. $this->getResponse()->appendBody("<p>Wywołano metodę dispatchLoopShutdown()</p>\n");
  135. }
  136. }
  137. $front = Zend_Controller_Front::getInstance();
  138. $front->setControllerDirectory('/path/to/controllers')
  139. ->setRouter(new Zend_Controller_Router_Rewrite())
  140. ->registerPlugin(new MyPlugin());
  141. $front->dispatch();
  142. ]]>
  143. </programlisting>
  144. <para>
  145. Zakładając, że żadne wywołana akcja nie wyświetliła żadnych danych, i
  146. że tylko jedna akcja została wywołana, to funkcjonalność powyższej
  147. wtyczki spowoduje wyświetlenie takich danych:
  148. </para>
  149. <programlisting role="php"><![CDATA[
  150. <p>Wywołano metodę routeStartup()</p>
  151. <p>Wywołano metodę routeShutdown()</p>
  152. <p>Wywołano metodę dispatchLoopStartup()</p>
  153. <p>Wywołano metodę preDispatch()</p>
  154. <p>Wywołano metodę postDispatch()</p>
  155. <p>Wywołano metodę dispatchLoopShutdown()</p>
  156. ]]>
  157. </programlisting>
  158. <note>
  159. <para>
  160. Wtyczki mogą być zarejestrowane w dowolnym momencie podczas
  161. uruchomienia kontrolera frontowego. Jednak jeśli zdarzenie dla
  162. którego we wtyczce była zarejestrowana metoda już minęło, to
  163. metoda ta będzie ominięta.
  164. </para>
  165. </note>
  166. </sect2>
  167. <sect2 id="zend.controller.plugins.standard">
  168. <title>Wtyczki dołączone do standardowej dystrybucji</title>
  169. <para>
  170. Zend Framework w standardowej dystrybucji zawiera wtyczkę służącą do
  171. obsługi błędów.
  172. </para>
  173. <xi:include href="Zend_Controller-Plugins-ActionStack.xml">
  174. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-Plugins-ActionStack.xml" /></xi:fallback>
  175. </xi:include>
  176. <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml">
  177. <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-Plugins-ErrorHandler.xml" /></xi:fallback>
  178. </xi:include>
  179. </sect2>
  180. </sect1>