Rozdział 4. Zend_Controller
Poprzedni |  | Następny

## Rozdział 4. Zend_Controller

## 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
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.

Poprzedni |  | Następny
3.4. Zend_Config_Xml | Spis treści | 4.2. Pierwsze kroki