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.