Rozdział 4. Zend_Controller

Spis treści

4.1. Wstęp
4.1.1. Wprowadzenie
4.1.2. Proces Routingu
4.1.3. Dispatch Token
4.1.4. Proces Dispatchingu
4.2. Pierwsze kroki
4.2.1. Wprowadzenie
4.2.2. Konfiguracja serwera
4.2.3. Plik ładujący
4.2.4. Struktura katalogów
4.2.5. IndexController
4.3. Rozszerzanie
4.3.1. Wprowadzenie
4.3.2. Konwencje
4.3.3. Interfejs Routera
4.3.4. Interfejs dispatchera
4.4. Wtyczki
4.4.1. Wprowadzenie

4.1. Wstęp

4.1.1. Wprowadzenie

Zend_Controller dostarcza system umożliwiający budowę witryny opartej na wzorcu MVC (Model-View-Controller - Model-Widok-Kontroler).

System Zend_Controller został zaprojektowany aby być lekkim, modułowym i rozszerzalnym. Projekt jest minimalistyczny w celu zapewnienia elastyczności i wolności użytkownikom, jednak zapewniając wystarczającą strukturę powoduje, że systemy zbudowane w oparciu o Zend_Controller będą napisane w podobnych konwencjach.

System Zend_Controller został zaimplementowany jako kilka komponentów. Nie jest wymagane posiadanie dokładnej wiedzy na temat działania wszystkich tych komponentów, jednak znajomość tego procesu może być pomocna.

  • Zend_Controller_Front instrumentuje całą przestrzeń systemu Zend_Controller. Jest interpretacją wzorca projektowego FrontController. Obiekt Zend_Controller_Front przetwarza wszystkie żądania otrzymywane przez serwer i jest ostatecznie odpowiedzialny za przekazywanie żądań do odpowiednich kontrolerów (Zend_Controller_Action).

  • Zend_Controller_Router jest routerem. Routing jest procesem pobierania adresu URI i rozkładania go w celu ustalenia, który kontroler i która akcja powinny otrzymać żądanie. Nazwa kontrolera, nazwa akcji oraz opcjonalne parametry są pakowane do obiektu Zend_Controller_Dispatcher_Token. Te dane są obraniane przez Zend_Controller_Dispatcher. Proces routingu ma miejsce tylko raz: pomiędzy odebraniem żądania a wywołaniem pierwszego kontrolera.

  • Zend_Controller_Dispatcher jest dispatcherem. Dispatching (wysyłanie) jest procesem pobierania obiektu Zend_Controller_Dispatcher_Token, szukania odpowiedniego kontrolera, tworzenia instancji klasy kontrolera z tego pliku (klasa ta musi implementować Zend_Controller_Action) i ostatecznie wywoływania metody akcji w tym obiekcie kontrolerze. W przeciwieństwie do routingu który ma miejsce tylko raz, proces dispatchingu odbywa się w pętli. Zend_Controller_Dispatcher jest wywoływany przez Zend_Controller_Front dopóki wszystkie akcje nie zostaną wywołane.

  • Zend_Controller_Action jest podstawowym komponentem kontrolera. Każdy kontroler jest pojedynczą klasą, która rozszerza klasę Zend_Controller_Action, a ta klasa posiada metody które są akcjami.

Przestrzeń systemu Zend_Controller jest stosunkowo prosta. Żądanie jest odbierane przez obiekt Zend_Controller_Front, który wywołuje Zend_Controller_Router w celu określenia kontrolera (i akcji w tym kontrolerze) do uruchomienia. Zend_Controller_Router rozkłada adres URI na części i zapisuje je w obiekcie Zend_Controller_Dispatcher_Token, który zawiera informacje o tym który kontroler i akcję ma uruchomić. Wtedy Zend_Controller_Front rozpoczyna pętlę uruchamiania akcji z kontrolerów. Uruchamia Zend_Controller_Dispatcher, przekazując mu token w celu uruchomienia odpowiedniego kontrolera i akcji. Gdy kontroler kończy działanie, kontrola wraca do obiektu Zend_Controller_Front. Jeśli kontroler zwracając nowy token wskazał kolejny kontroler, który powinien być uruchomiony pętla kontynuuje działanie i kolejny kontroler zostaje uruchomiony. W przeciwnym wypadku proces się kończy.

4.1.2. Proces Routingu

Zanim zbudujesz swój pierwszy kontroler, powinieneś zrozumieć jak działa proces routingu który jest zaimplementowany jako Zend_Controller_Router. Pamiętaj, że przestrzeń działania jest podzielona na routing, który ma miejsce tylko raz oraz na proces dispatchingu, który odbywa się w pętli.

Zend_Controller_Front wywołuje Zend_Controller_Router aby zmapować adres URI do kontrolera oraz do akcji wewnątrz kontrolera. Zend_Controller_Router pobiera adres URI a następnie rozkłada go na części i zapisuje w obiekcie Zend_Controller_Dispatcher_Token, który będzie przekazany do dispatchera (Zend_Controller_Dispatcher).

Router używa bardzo prostego mapowania nazwy kontrolera i nazwy akcji z tego kontrolera:

http://framework.zend.com/controller/action/
			

Pamiętaj, że powyżej pierwsza część adresu jest nazwą kontrolera, a druga część jest zawsze nazwą akcji.

Opcjonalnie w adresie URI mogą być zdefiniowane parametry które zostaną przekazane do kontrolera. Przyjmują one postać par klucz/wartość:

http://framework.zend.com/controller/action/key1/value1/
			

Jeśli pierwsza część adresu URI (/controller/) jest pusta, zostanie przyjęta nazwa domyślnego kontrolera czyli "index". Jeśli pusta jest część /action/, zostanie przyjęta nazwa akcji domyślnej czyli "index". Oto przykłady:

http://framework.zend.com/roadmap/future/
Kontroler: roadmap
Akcja    : future

http://framework.zend.com/roadmap/
Kontroler: roadmap
Akcja    : index

http://framework.zend.com/
Kontroler: index
Akcja    : index
				

[Notatka] Notatka
Obecnie pracujemy nad nowym routerem z silnikiem przepisywania adresów URI, który da o wiele szersze możliwosci niż te obecnie dostępne w routerze. Będzie to dostępne w niedalekiej przyszłości.

Nazwa kontrolera, nazwa akcji z tego kontrolera oraz opcjonalne parametry są pakowane do tokena Zend_Controller_Dispatcher_Token. Ten token jest przekazywany do obiektu Zend_Controller_Front, który rozpocznie pętlę uruchamiania kontrolerów. Gdy pętla trwa, token jest przekazywany do obiektu Zend_Controller_Dispatcher.

4.1.3. Dispatch Token

Token jest prostym obiektem który jest przekazywany pomiędzy obiektem Zend_Controller_Front a klasami które implementują interfejsy routera i dispatchera. Przechowuje on informacje o kontrolerze, akcji oraz o parametrach które mają być przekazane do akcji.

  • Dostęp do nazwy kontrolera uzyskujemy za pomocą metod getControllerName() oraz setControllerName().

  • Dostęp do nazwy akcji uzyskujemy za pomocą metod getActionName() oraz setActionName().

  • Parametry przekazane do akcji są tablicą asocjacyjną składającą się z par klucz/wartość, które są dostępne za pomocą metod getParams() oraz setParams().

4.1.4. Proces Dispatchingu

Dispatching (wysyłanie) jest procesem pobierania tokena Zend_Controller_Dispatcher_Token, rozpakowania informacji które on zawiera: nazwy kontrolera, nazwy akcji oraz opcjonalnych parametrów i ostatecznie utworzeniem instancji kontrolera i wywołaniem akcji z tego kontrolera.