1 <sect1 id="zend.controller.migration">
2 <title>Migracja z poprzednich wersji</title>
5 API komponentów MVC zmieniało się z biegiem czasu. Jeśli zacząłeś używać
6 Zend Framework we wczesnej wersji, postępuj według poniższych wskazówek
7 aby przeprowadzić migrację swoich skryptów aby używały nowej architektury.
10 <sect2 id="zend.controller.migration.fromoneohtoonesix">
11 <title>Migracja z wersji 1.5.x do 1.6.0 lub nowszej</title>
13 <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
14 <title>Zmiany w interfejsie obiektu uruchamiającego</title>
17 Użytkownicy zwrócili naszą uwagę na fakt, że klasy
18 <code>Zend_Controller_Front</code> oraz
19 <code>Zend_Controller_Router_Route_Module</code> używały metod
20 obiektu uruchamiającego, które nie były zdefiniowane w
21 interfejsie tego obiektu.
22 Dodaliśmy teraz do interfejsu poniższe trzy metody aby upewnić
23 się, że własne obiekty uruchamiające będą poprawnie działać:
28 <code>getDefaultModule()</code>: metoda powinna zwracać
29 nazwę domyślnego modułu.
33 <code>getDefaultControllerName()</code>: metoda powinna
34 zwracać nazwę domyślnego kontrolera.
38 <code>getDefaultAction()</code>: metoda powinna zwracać
39 nazwę domyślnej akcji.
45 <sect2 id="zend.controller.migration.fromoneohtoonefive">
46 <title>Migracja z wersji 1.0.x do 1.5.0 lub nowszej</title>
49 O ile większość z podstawowych funkcjonalności i cała udokumentowana
50 funkcjonalność pozostały te same, to nastąpiła jedna istotna zmiana
51 w jednej <emphasis>nieudokumentowanej</emphasis> funkcjonalności.
55 Udokumentowanym sposobem tworzenia adresów URL w postaci camelCased
56 jest użycie znaku separatora w nazwie akcji; domyślnie separatorem
57 mogą być znaki '.' lub '-', jednak może to być skonfigurowane w
58 obiekcie uruchamiającym. Obiekt uruchamiający zmienia litery w
59 nazwie akcji na małe i używa separatorów aby otrzymać nazwę metody
60 akcji w postaci camelCasing. Jednak z tego powodu, że funkcje PHP
61 nie są wrażliwe na wielkość liter, <emphasis>mogłeś</emphasis> wciąż
62 tworzyć adresy w postaci camelCasing, a obiekt uruchamiający wciąż
63 otrzymywał na ich podstawie nazwę tej samej akcji. Na przykład adres
64 'camel-cased' zostałby zamieniony przez obiekt uruchamiający na
65 'camelCasedAction', a adres 'camelCased' na 'camelcasedAction';
66 z tego powodu że PHP nie jest wrażliwe na wielkość liter, w obu
67 przypadkach zostanie uruchomiona ta sama metoda.
71 Powoduje to problemy w klasie ViewRenderer gdy szuka ona skryptów
72 widoku. Podstawowym udokumentowanym sposobem jest zastępowanie
73 wszystkich separatorów wyrazów znakiem podkreślenia oraz zmiana
74 liter na małe. Wprowadza to niezgodność semantyczną pomiędzy akcjami
75 a skryptami widoków, a regulacja tego pozwoli na znajdowanie
76 skryptów widoków w każdej sytuacji. Teraz jeśli wywołamy metodę
77 'camelCased', separator wyrazów nie będzie już znajdować się w
78 nazwie i ViewRenderer spróbuje uruchomić inny plik --
79 'camelcased.phtml' zamiast 'camel-cased.phtml'.
83 Niektórzy programiści polegali na tej "funkcjonalności", która nigdy
84 nie była zamierzona. Wiele zmian w wersji 1.5.0 spowodowało, że
85 klasa ViewRenderer nie znajduje już plików widoków w taki sposób;
86 semnatyczna zgodność jest teraz wymuszona. Po pierwsze, obiekt
87 uruchamiający wymusza teraz wrażliwość na wielkość liter w nazwach
88 akcji. Oznacza to, że odwoływanie się do akcji używając w adresie
89 formy camelCasing nie będzie już dłużej prowadzić do tej samej
90 metody, do której prowadziło odwołanie za pomocą separatorów
91 wyrazów (np., 'camel-casing'). Teraz klasa ViewRenderer podczas
92 szukania skryptów widoku akceptuje jedynie formę z separatorami
97 Jeśli okazało się, że polegałeś na tej "funkcjonalności", masz kilka
103 Najlepsza opcja: zmień nazwy skwoich skryptów wiodku. Plus:
104 kompatybilność wsteczna. Minus: jeśli masz dużo skryptów
105 widoku, które polegają na tym niezamierzonym zachowaniu,
106 możesz mieć dużo plików do zmiany.
111 Druga najlepsza opcja: klasa ViewRenderer teraz określa
112 nazwę skryptu widoku za pomocą klasy <code>Zend_Filter_Inflector</code>;
113 możesz zmodyfikować reguły określania nazwy, aby nie używać
114 separatorów wyrazów w nazwach akcji.
117 <programlisting role="php"><![CDATA[
118 $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
119 $inflector = $viewRenderer->getInflector();
120 $inflector->setFilterRule(':action', array(
121 new Zend_Filter_PregReplace(
122 '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
131 Powyższy kod zmieni sposób określania nazwy skryptu widoku,
132 aby nie oddzielał słów za pomocą znaku podkreślenia; możesz
133 także usunać filtr 'StringToLower' jeśli
134 <emphasis>chcesz</emphasis> używać nazw skryptów widoku
135 w postaci camelCased.
139 Jeśli zmiana nazw skryptów widoku zajmie zbyt dużo czasu,
140 najlepszym sposobem będzie tymczasowe użycie powyższego kodu.
146 Najgorsza opcja: Możesz spowodować aby obiekt uruchamiający
147 uruchamiał akcje w postaci camelCased za pomocą nowej flagi
148 kontrolera frontowego, 'useCaseSensitiveActions':
151 <programlisting role="php"><![CDATA[
152 $front->setParam('useCaseSensitiveActions', true);
157 Pozwoli ci to wciąż używać formy camelCasing w adresach URL
158 i taie wywołanie będzie uruchamiać tę samą akcję jak podczas
159 użycia separatorów wyrazów. Jednak oznacza to, że oryginalny
160 błąd będzie wciąż występował; jeśli nie chcesz aby wystąpiły
161 problemy, użyj przynajmniej drugiej z przedstawionych opcji.
165 Zauważ też, że użycie tej flagi spowoduje wyświetlenie
166 informacji o tym, że jej użycie jest przestarzałe.
172 <sect2 id="zend.controller.migration.fromzeroninethree">
173 <title>Migracja z wersji 0.9.3 do 1.0.0RC1 lub nowszej</title>
176 Głównymi zmianami, jakie pojawiły się w wersji 1.0.0RC1 jest dodanie
177 i domyśle włączenie wtyczki <link
178 linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
179 oraz pomocniczej klasy akcji <link
180 linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
181 Proszę przeczytaj uważnie dokumentację obu komponentów aby dowiedzieć
182 się jak one działają i jakie efekty mogą one mieć w twoich aplikacjach.
186 Wtyczka <code>ErrorHandler</code> jest uruchamiana jako metoda
187 <code>postDispatch()</code> w celu sprawdzenia czy wyrzucone zostały
188 wyjątki i ewentualnego przeniesienia żądania do określonego kontrolera
189 obsługi błędów. Powinieneś mieć taki kontroler w swojej aplikacji.
190 Możesz jednak wyłączyć taką obsługę błędów ustawiając w kontrolerze
191 frontowym parametr <code>noErrorHandler</code>:
194 <programlisting role="php"><![CDATA[
195 $front->setParam('noErrorHandler', true);
200 Pomocnicza klasa akcji <code>ViewRenderer</code> automatyzuje
201 przekazywanie widoków do kontrolerów akcji oraz automatycznie
202 renderuje skrypty widoku oparte na nazwie danej akcji. Głównym
203 problemem jaki możesz napotkać są akcje, które nie renderują
204 skryptów widoków, nie przekierowują i nie przenoszą żądania, z tego
205 względu, że klasa <code>ViewRenderer</code> będzie próbować
206 renderować skrypt widoku oparty na nazwie akcji.
210 Jest kilka strategii które możesz podjąc aby zaktualizować swój kod.
211 Krótkoterminowo możesz globalnie wyłączyć użycie klasy
212 <code>ViewRenderer</code> w kontrolerze frontowym w pliku uruchamiającym
213 przed uruchomieniem żądania:
216 <programlisting role="php"><![CDATA[
217 // Zakładając, że $front jest instancją klasy Zend_Controller_Front
218 $front->setParam('noViewRenderer', true);
223 Jednak długoterminowo nie jest to dobra strategia, ponieważ będziesz
224 musiał pisać więcej kodu.
228 Kiedy będziesz gotowy do użycia funkcjonalności klasy <code>ViewRenderer</code>,
229 będzie kilka rzeczy które będziesz musiał sprawdzić w kodzie swoich kontrolerów.
231 Wpierw spójrz na metody akcji (metody kończące się na 'Action') i
232 sprawdź co one robią. Będziesz musiał wprowadzić zmiany, jeśli w
233 metodzie nie jest przeprowadzana żadna z poniższych czynności:
237 <listitem><para>Wywołanie metody <code>$this->render()</code></para></listitem>
238 <listitem><para>Wywołanie metody <code>$this->_forward()</code></para></listitem>
239 <listitem><para>Wywołanie metody <code>$this->_redirect()</code></para></listitem>
240 <listitem><para>Wywołanie pomocniczej klasy akcji <code>Redirector</code></para></listitem>
244 Najprostszym sposobem jest wyłączenie automatycznego renderowania dla tej metody:
247 <programlisting role="php"><![CDATA[
248 $this->_helper->viewRenderer->setNoRender();
253 Jeśli żadna z twoich akcji nie renderuje, nie przenosi i nie
254 przekierowuje, możesz powyższą linię umieścić w metodzie
255 <code>preDispatch()</code> lub <code>init()</code>:
258 <programlisting role="php"><![CDATA[
259 public function preDispatch()
261 // wyłączamy automatyczne renderowanie skryptu widoku
262 $this->_helper->viewRenderer->setNoRender()
263 // .. robimy coś dalej...
268 Jeśli wywołujesz metodę <code>render()</code>,
270 linkend="zend.controller.modular">klasycznej modularnej struktury
272 możesz potrzebować zaktualizować swój kod aby używał automatycznego
279 Jeśli renderujesz wiele skryptów widoków w jednej akcji,
280 nie musisz nic zmieniać w tej kwestii.
285 Jeśli wywołujesz metodę <code>render()</code> bez argumentów,
286 możesz po prostu usunąć te wywołania.
291 Jeśli wywołujesz metodę <code>render()</code> używając
292 argumentów i nie wykonujesz później innego kodu ani nie
293 renderujesz kolejnych skryptów widoku, możesz zmienić
294 wywołania aby korzystały z metody o tej samej nazwie, obiektu
295 <code>$this->_helper->viewRenderer()</code>.
301 Jeśli nie używasz klasycznej modularnej struktury katalogów, jest
302 wiele sposobów ustawienia bazowej ścieżki widoków i specyfikacji
303 ścieżek skryptów, do czego możesz użyć klasy <code>ViewRenderer</code>.
304 Proszę przeczytaj <link
305 linkend="zend.controller.actionhelpers.viewrenderer">dokumentację
306 klasy ViewRenderer</link> aby uzyskać więcej informacji na
311 Jeśli używasz obiektu widoku z rejestru, konfigurujesz swój własny
312 obiekt lub używasz innej implementacji widoku, możesz przekazać ten
313 obiekt do obiektu <code>ViewRenderer</code>. Możesz to łatwo zrobić
320 Przed uruchomieniem kontrolera frontowego:
323 <programlisting role="php"><![CDATA[
324 // Zakładając, że obiekt $view został już zdefiniowany
325 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
326 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
333 W dowolnej chwili podczas procesu ładowania:
336 <programlisting role="php"><![CDATA[
337 $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
338 $viewRenderer->setView($view);
345 Jest wiele sposobów na zmodyfikowanie obiektu <code>ViewRenderer</code>,
346 włączając w to ustawienie innego skryptu widoku do renderowania,
347 zastąpienie wszystkich części ścieżki skrytu widoku (także przyrostka),
348 wybranie segmentu obiektu odpowiedzi w którym ma być zrenderowany
349 i kilka innych. Jeśli nie chcesz używać klasycznej modularnej
350 struktury katalogów, możesz określić inne specyfikacje ścieżek za
351 pomocą klasy <code>ViewRenderer</code>.
355 Zalecamy zaadaptowanie w swoim kodzie użycia wtyczki
356 <code>ErrorHandler</code> oraz pomocniczej klasy akcji
357 <code>ViewRenderer</code> z tego względu, że te funkcjonalności są
358 teraz składnikiem jądra.
362 <sect2 id="zend.controller.migration.fromzeroninetwo">
363 <title>Migracja z wersji 0.9.2 do 0.9.3 lub nowszej</title>
366 W wersji 0.9.3 pojawiają się <link
367 linkend="zend.controller.actionhelpers">klasy pomocnicze akcji</link>.
368 W związku z tym, poniższe metody zostały usunięte, z tego względu, że
369 teraz są one zawarte w <link
370 linkend="zend.controller.actionhelpers.redirector">przekierowującej
371 pomocniczej klasie akcji</link>:
377 <code>setRedirectCode()</code>; użyj
378 <code>Zend_Controller_Action_Helper_Redirector::setCode()</code>.
383 <code>setRedirectPrependBase()</code>; użyj
384 <code>Zend_Controller_Action_Helper_Redirector::setPrependBase()</code>.
389 <code>setRedirectExit()</code>; użyj
390 <code>Zend_Controller_Action_Helper_Redirector::setExit()</code>.
396 Przeczytaj <link linkend="zend.controller.actionhelpers">dokumentację
397 pomocniczych klas akcji</link> aby uzyskać więcej informacji o tym
398 jak można pobrać obiekty pomocnicze i jak nimi manipulować, oraz dokumentację
399 <link linkend="zend.controller.actionhelpers.redirector">przekierowującej
400 pomocniczej klasy akcji</link> w celu uzyskania informacji o ustawianiu
401 opcji przekierowania (a także o innych metodach dla przekierowań).
405 <sect2 id="zend.controller.migration.fromzerosix">
406 <title>Migracja z wersji 0.6.0 do 0.8.0 lub nowszej</title>
409 Od czasu poprzednich zmian, najbardziej podstawowe użycie
410 komponentów MVC pozostaje takie same:
413 <programlisting role="php"><![CDATA[
414 Zend_Controller_Front::run('/path/to/controllers');
419 Jakkolwiek, struktura katalogów została przebudowana, kilka
420 komponentów usunięto, kilku innym zmieniono nazwy, a także kilka
427 Klasa <code>Zend_Controller_Router</code> została usunięta
428 na rzecz rewrite routera.
434 Nazwa klasy <code>Zend_Controller_RewriteRouter</code>
435 została zmieniona na <code>Zend_Controller_Router_Rewrite</code>
436 i awansowała ona na standardowy router dostarczany z frameworkiem;
437 <code>Zend_Controller_Front</code> użyje go domyślnie, jeśli
438 żaden inny router nie zostanie ustawiony.
444 Nowa klasa trasy doa użycia z rewrite routerem została
445 przedstawiona, jest to
446 <code>Zend_Controller_Router_Route_Module</code>; kryje
447 ona w sobie domyślną trasę używaną przez MVC i wspiera <link
448 linkend="zend.controller.modular">moduły
455 Nazwa klasy <code>Zend_Controller_Router_StaticRoute</code>
457 <code>Zend_Controller_Router_Route_Static</code>.
463 Nazwa klasy <code>Zend_Controller_Dispatcher</code> została
464 zmieniona na <code>Zend_Controller_Dispatcher_Standard</code>.
470 Zmieniły się argumenty metody
471 <code>Zend_Controller_Action::_forward()</code>. Sygnatura
472 wygląda teraz następująco:
475 <programlisting role="php"><![CDATA[
476 final protected function _forward($action, $controller = null, $module = null, array $params = null);
481 Parametr <code>$action</code> jest zawsze wymagany; jeśli
482 kontroler nie jest określony, to brana pod uwagę jest akcja
483 z obecnego kontrolera. Parametr <code>$module</code> jest
484 zawsze ignorowany, o ile parametr <code>$controller</code>
485 nie jest określony. Ostatecznie każdy z parametrów w
486 tablicy <code>$params</code> będzie dołączony do obiektu
487 żądania. Jeśli nie potrzebujesz określić kontrolera lub
488 modułu, ale potrzebujesz przekazać parametry, po prostu
489 określ te wartości jako null.
495 <sect2 id="zend.controller.migration.fromzerotwo">
496 <title>Migracja z wersji 0.2.0 lub z poprzednich do 0.6.0</title>
499 Podstawowy sposób korzystania z komponentów MVC nie zmienił się;
500 nadal możesz użyć poniższego kodu:
503 <programlisting role="php"><![CDATA[
504 Zend_Controller_Front::run('/path/to/controllers');
508 <programlisting role="php"><![CDATA[
509 /* -- utwórz router -- */
510 $router = new Zend_Controller_RewriteRouter();
511 $router->addRoute('user', 'user/:username', array('controller' => 'user',
512 'action' => 'info'));
514 /* -- ustawić go w kontrolerze -- */
515 $ctrl = Zend_Controller_Front::getInstance();
516 $ctrl->setRouter($router);
518 /* -- ustawić katalog kontrolerów i uruchomić -- */
519 $ctrl->setControllerDirectory('/path/to/controllers');
525 Zalecamy użycie obiektu odpowiedzi (Response) do łączenia zawartości
526 i nagłówków. To pozwala na bardziej elastyczne zmiany formatu danych
527 wyjściowych (na przykład JSON lub XML zamiast XHTML) w twoich
528 aplikacjach. Domyślnie metoda <code>dispatch()</code> zrenderuje
529 całą odpowiedź, wyśle nagłówki i całą zawartość. Możesz także
530 użyć kontrolera frontowego aby zwrócił zawartość za pomocą metody
531 <code>returnResponse()</code>, a potem zrenderować odpowiedź używając
532 twojej własnej logiki. Przyszłe wersje kontrolera frontowego mogą
533 forsować użycie obiektu odpowiedzi przez wyświetlenie danych
538 Jest wiele dodatkowych funkcjonalności, które rozszerzają istniejące
539 API i są one opisane w dokumentacji.
543 Główne zmiany, na które musisz uważać, nastąpiły przy tworzeniu klas
544 pochodnych komponentów. Te zmiany to:
550 <code>Zend_Controller_Front::dispatch()</code> domyślnie
551 łapie wyjątki w obiekcie odpowiedzi i nie renderuje ich
552 aby zapobiec wyświetlaniu ważnych informacji systemowych.
553 Możesz zmienić to zachowanie na kilka sposobów:
559 Ustaw <code>throwExceptions()</code> w kontrolerze
562 <programlisting role="php"><![CDATA[
563 $front->throwExceptions(true);
570 Ustaw <code>renderExceptions()</code> w obiekcie
573 <programlisting role="php"><![CDATA[
574 $response->renderExceptions(true);
575 $front->setResponse($response);
579 $front->returnResponse(true);
580 $response = $front->dispatch();
581 $response->renderExceptions(true);
590 <code>Zend_Controller_Dispatcher_Interface::dispatch()</code>
591 zamiast tokena dispatchera przyjmuje i zwraca teraz
592 obiekt <xref linkend="zend.controller.request" />.
596 <code>Zend_Controller_Router_Interface::route()</code>
597 przyjmuje i zwraca obiekt <xref linkend="zend.controller.request" />
598 zamiast tokena dispatchera.
602 <para>Zmiany w <code>Zend_Controller_Action</code> to:</para>
606 Kontruktor teraz przyjmuje dokładnie trzy argumenty,
607 <code>Zend_Controller_Request_Abstract $request</code>,
608 <code>Zend_Controller_Response_Abstract $response</code>,
609 oraz <code>array $params (opcjonalny)</code>.
610 <code>Zend_Controller_Action::__construct()</code> używa
611 ich aby ustawić żądanie, odpowiedź, i właściwości
612 invokeArgs obiektu i jeśli nadpisujesz konstruktor,
613 powinieneś je także ustawić. Lepiej jednak użyj
614 metody <code>init()</code> aby skonfigurować instancję,
615 ponieważ ta metoda jest wywoływana jako ostatnia akcja
620 Metoda <code>run()</code> nie jest już zdefiniowana jako finalna,
621 ale nie jest też już używana przez kontroler frontowy;
622 Jej jedynym celem jest użycie klasy jako kontrolera strony.
623 Przyjmuje ona teraz dwa opcjonalne argumenty,
624 <code>Zend_Controller_Request_Abstract $request</code>
625 oraz <code>Zend_Controller_Response_Abstract $response</code>.
629 Akcja <code>indexAction()</code> nie musi być już
630 zdefiniowana, ale jest zalecana jako domyślna akcja.
631 To pozwala routerowi RewriteRouter oraz kontrolerom akcji
632 na określenie innych domyślnych metod akcji.
636 Metoda <code>__call()</code> powinna być nadpisana aby
637 obsłużyć automatycznie niezdefiniowane akcje.
641 Metoda <code>_redirect()</code> przyjmuje teraz opcjonalny
642 drugi argument, kod HTTP, który ma być zwrócony z
643 przekierowaniem oraz opcjonalny trzeci argument,
644 <code>$prependBase</code>, który może zdecydować czy
645 bazowy adres URL zarejestrowany w obiekcie żądania ma być
646 dodany do adresu URL.
651 Właściwość <code>_action</code> nie jest już
652 zdefiniowana. Ta właściwość była obiektem
653 <code>Zend_Controller_Dispatcher_Token</code>, który
654 nie istnieje już w aktualnej wersji. Jedynym
655 zastosowaniem tokena było przechowanie informacji o
656 zażądanym kontrolerze, akcji i parametrach URL. Te
657 informacje są teraz dostępne w obiekcie żądania w
661 <programlisting role="php"><![CDATA[
662 // Pobierz nazwę kontrolera z żądania
663 // Dotychczas dostęp do niej był za pomocą: $this->_action->getControllerName().
664 // Poniższy przykład używa metody getRequest(), ale możesz także bezpośrednio
665 // użyć właściwości $_request; użycie getRequest() jest zalecane ponieważ klasa
666 // rodzica może nadpisać dostęp do obiektu żądania.
667 $controller = $this->getRequest()->getControllerName();
669 // Pobierz nazwę akcji z żądania
670 // Dotychczas dostęp do niej był za pomocą: $this->_action->getActionName().
671 $action = $this->getRequest()->getActionName();
673 // Pobierz parametry z żądania
674 // To się nie zmieniło; metody _getParams() oraz _getParam() teraz w prosty
675 // sposób wskazują na obiekt żądania.
676 $params = $this->_getParams();
677 $foo = $this->_getParam('foo', 'default'); // pobierz parametr 'foo', używając
678 // wartości 'default' jako domyślnej
685 Metoda <code>noRouteAction()</code> została usunięta.
686 Aby w poprawny sposób obsługiwać nieistniejące
687 metody akcji powinieneś przekierować je do domyślnej
688 akcji używając metody <code>__call()</code>:
691 <programlisting role="php"><![CDATA[
692 public function __call($method, $args)
694 // Jeśli została zażądania nieistniejąca metoda 'Action', żądanie zostanie
695 // przekazane do domyślnej metody akcji:
696 if ('Action' == substr($method, -6)) {
697 return $this->defaultAction();
700 throw new Zend_Controller_Exception('Nieprawdiłowa metoda');
709 Akcja <code>Zend_Controller_RewriteRouter::setRewriteBase()</code>
710 została usunięta. W zamian użyj
711 <code>Zend_Controller_Front::setBaseUrl()</code>
712 (lub Zend_Controller_Request_Http::setBaseUrl(), jeśli używasz
717 Interfejs <code>Zend_Controller_Plugin_Interface</code> został
718 zamieniony na <code>Zend_Controller_Plugin_Abstract</code>.
719 Wszystkie metody przyjmują i zwracają obiekt
720 <xref linkend="zend.controller.request" />
721 zamiast tokena dispatchera.