Spis treści
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.
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 |
|---|---|
| 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.
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().
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.