1 <sect1 id="zend.controller.plugins" xmlns:xi="http://www.w3.org/2001/XInclude">
4 <sect2 id="zend.controller.plugins.introduction">
5 <title>Wprowadzenie</title>
8 Architektura kontrolera zawiera także system wtyczek, który pozwala
9 programiście na wykonanie własnego kodu, gdy następują określone
10 zdarzenia w trakcie trwania procesu kontrolera. Kontroler frontowy
11 używa agenta wtyczek jako rejeestru dla wtyczek programisty,
12 a agent wtyczek jest odpowiedzialny za to, że metody zdarzeń są
13 wywoływane dla każdej wtyczki zarejestrowanej w kontrolerze
18 Metody zdarzeń są zdefiniowane w klasie abstrakcyjnej
19 <code>Zend_Controller_Plugin_Abstract</code>, z której dziedziczy
26 Metoda <code>routeStartup()</code> jest wywoływana zanim
27 <code>Zend_Controller_Front</code> wywoła <link
28 linkend="zend.controller.router">router</link> w celu
29 sprawdzenia żądania pod kątem zarejestrowanych tras.
35 Metoda <code>routeShutdown()</code> jest wywoływana po tym
36 jak <link linkend="zend.controller.router">router</link>
37 zakończy routing żądania.
43 Metoda <code>dispatchLoopStartup()</code> jest uruchamiana
44 zanim <code>Zend_Controller_Front</code> zacznie pętlę
51 Metoda <code>preDispatch()</code> jest wywoływana zanim
52 akcja zostanie uruchomiona przez
53 <link linkend="zend.controller.dispatcher">obiekt
54 uruchamiający</link>. Pozwala to na stworzenie
55 funkcjonalności proxy lub filtra. Nadpisując żądanie i
56 resetując flagę uruchomienia (za pomocą
57 <code>Zend_Controller_Request_Abstract::setDispatched(false)</code>),
58 obecna akcja może być pominięta lub zastąpiona.
64 <code>postDispatch()</code> jest wywoływana po tym jak akcja
65 zostanie uruchomiona przez
66 <link linkend="zend.controller.dispatcher">obiekt
67 uruchamiający</link>. Pozwala to na stworzenie
68 funkcjonalności proxy lub filtra. Nadpisując żądanie i
69 resetując flagę uruchomienia (za pomocą
70 <code>Zend_Controller_Request_Abstract::setDispatched(false)</code>),
71 można określić nową akcję do uruchomienia.
77 Metoda <code>dispatchLoopShutdown()</code> jest wywoływana
78 po tym jak <code>Zend_Controller_Front</code> zakończy
85 <sect2 id="zend.controller.plugins.writing">
86 <title>Pisanie wtyczek</title>
89 W celu napisania klasy wtyczki, w prosty sposób rozszerz klasę
90 abstrakcyjną <code>Zend_Controller_Plugin_Abstract</code>:
93 <programlisting role="php"><![CDATA[
94 class MyPlugin extends Zend_Controller_Plugin_Abstract
102 Żadna z metod klasy <code>Zend_Controller_Plugin_Abstract</code> nie
103 jest abstrakcyjna, co oznacza, że nie jest konieczne implementowanie
104 wszystkich dostępnych metod zdarzeń opisanych powyżej. Autor wtyczki
105 może zaimplementować tylko te metody zdarzeń, które są mu
106 rzeczywiście potrzebne.
109 <code>Zend_Controller_Plugin_Abstract</code> udostępnia także
110 obiekty żądania i odpowiedzi wtyczkom kontrolera za pomocą metod
111 <code>getRequest()</code> oraz <code>getResponse()</code>, odpowiednio.
115 <sect2 id="zend.controller.plugins.using">
116 <title>Użycie wtyczek</title>
118 Klasy wtyczek są rejestrowane za pomocą metody
119 <code>Zend_Controller_Front::registerPlugin()</code> i mogą być
120 rejestrowane w dowolnym momencie. Poniższy kod pokazuje w jaki
121 sposób wtyczka może być użyta przez kontroler:
124 <programlisting role="php"><![CDATA[
125 class MyPlugin extends Zend_Controller_Plugin_Abstract
127 public function routeStartup(Zend_Controller_Request_Abstract $request)
129 $this->getResponse()->appendBody("<p>Wywołano metodę routeStartup()</p>\n");
132 public function routeShutdown(Zend_Controller_Request_Abstract $request)
134 $this->getResponse()->appendBody("<p>Wywołano metodę routeShutdown()</p>\n");
137 public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
139 $this->getResponse()->appendBody("<p>Wywołano metodę dispatchLoopStartup()</p>\n");
142 public function preDispatch(Zend_Controller_Request_Abstract $request)
144 $this->getResponse()->appendBody("<p>Wywołano metodę preDispatch()</p>\n");
147 public function postDispatch(Zend_Controller_Request_Abstract $request)
149 $this->getResponse()->appendBody("<p>Wywołano metodę postDispatch()</p>\n");
152 public function dispatchLoopShutdown()
154 $this->getResponse()->appendBody("<p>Wywołano metodę dispatchLoopShutdown()</p>\n");
158 $front = Zend_Controller_Front::getInstance();
159 $front->setControllerDirectory('/path/to/controllers')
160 ->setRouter(new Zend_Controller_Router_Rewrite())
161 ->registerPlugin(new MyPlugin());
167 Zakładając, że żadne wywołana akcja nie wyświetliła żadnych danych, i
168 że tylko jedna akcja została wywołana, to funkcjonalność powyższej
169 wtyczki spowoduje wyświetlenie takich danych:
172 <programlisting role="php"><![CDATA[
173 <p>Wywołano metodę routeStartup()</p>
174 <p>Wywołano metodę routeShutdown()</p>
175 <p>Wywołano metodę dispatchLoopStartup()</p>
176 <p>Wywołano metodę preDispatch()</p>
177 <p>Wywołano metodę postDispatch()</p>
178 <p>Wywołano metodę dispatchLoopShutdown()</p>
184 Wtyczki mogą być zarejestrowane w dowolnym momencie podczas
185 uruchomienia kontrolera frontowego. Jednak jeśli zdarzenie dla
186 którego we wtyczce była zarejestrowana metoda już minęło, to
187 metoda ta będzie ominięta.
192 <sect2 id="zend.controller.plugins.standard">
193 <title>Wtyczki dołączone do standardowej dystrybucji</title>
196 Zend Framework w standardowej dystrybucji zawiera wtyczkę służącą do
200 <xi:include href="Zend_Controller-Plugins-ActionStack.xml">
201 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-Plugins-ActionStack.xml" /></xi:fallback>
203 <xi:include href="Zend_Controller-Plugins-ErrorHandler.xml">
204 <xi:fallback><xi:include href="../../en/module_specs/Zend_Controller-Plugins-ErrorHandler.xml" /></xi:fallback>