Kapitel 4. Zend_Controller
Zurück |  | Weiter

## Kapitel 4. Zend_Controller

## 4.1. Überblick

### 4.1.1. Einführung

`Zend_Controller` stellt das Fundament für den Aufbau einer Website auf Basis des Model-View-Controller (MVC) Entwurfsmusters bereit.

Das `Zend_Controller` System wurde leichtgewichtig, modular und erweiterbar gestaltet. Die Form ist einfach, um den Benutzern viel Flexibilität und Freiheiten zu ermöglichen. Dennoch bietet es ausreichend Struktur, damit Systeme, die auf den `Zend_Controller` aufbauen, gemeinsame Konventionen befolgen und einen ähnlichen Code Aufbau verwenden.

Der `Zend_Controller` Ablauf wurde durch verschiedene Komponenten implementiert. Während es für die Benutzung des Systems nicht notwendig ist, den kompletten Unterbau all dieser Komponenten zu verstehen, ist es hilfreich, über ausreichend Kenntnisse des Ablaufes zu verfügen.

- `Zend_Controller_Front` steuert den gesamten Ablauf des `Zend_Controller` Systems. Es ist eine Interpretation des FrontController Entwurfsmusters. `Zend_Controller_Front` verarbeitet alle Anfragen, die der Server erhält, und ist letztendlich dafür verantwortlich, die Anfragen an die ActionController (`Zend_Controller_Action`) zu deligieren.

- `Zend_Controller_Router` ist der Router. Routing ist der Prozess der Übernahme und Zerteilung einer URI, um zu ermitteln, welcher Controller und welche Aktion des Controllers die Anfrage erhalten soll. Die Definition des Controllers, der Aktion sowie weiterer Parameter wird in einem Objekt mit Namen `Zend_Controller_Dispatcher_Token` gekapselt. Dieser wird dann vom `Zend_Controller_Dispatcher` verarbeitet. Das Routing geschieht nur einmal: wenn zu Beginn die Anfrage erhalten wird und bevor der erste Controller aufgerufen wird.

- `Zend_Controller_Dispatcher` ist der Dispatcher. Dispatching ist der Prozess, bei dem der `Zend_Controller_Dispatcher_Token` übernommen, die entsprechende Controller Datei gefunden, die Controller Klasse (muß `Zend_Controller_Action` implementieren) in dieser Datei instanziiert und letztendlich die Methode für die Aktion in dem Controller Objekt aufgerufen wird. Anders als das Routing, das immer nur einmal vorkommt, erfolgt das Dispatching in einer Schleife. `Zend_Controller_Dispatcher` wird wiederholt von `Zend_Controller_Front` aufgerufen, bis alle Aktionen nacheinander ausgeführt worden sind.

- `Zend_Controller_Action` ist die elementare Controller Komponente. Jeder Controller ist eine einzelne Klasse, welche die `Zend_Controller_Action` Klasse erweitert und Methoden für die Aktionen enthält.

Der Ablauf vom `Zend_Controller` ist relativ einfach. Eine Anfrage wird vom `Zend_Controller_Front` empfangen, der wiederum `Zend_Controller_Router` aufruft, um zu ermitteln, welcher Controller (und welche Aktion in dem Controller) ausgeführt werden soll. `Zend_Controller_Router` zerteilt die URI in ein `Zend_Controller_Dispatcher_Token` Objekt, welches angibt, was auszuführen ist. `Zend_Controller_Front` durchläuft dann eine Dispatcher Schleife. Er ruft `Zend_Controller_Dispatcher` auf und übergibt den Token, um den aktuellen Controller und die aktuelle Aktion auszuführen. Wenn der Controller fertig ist, wird die Kontrolle wieder an `Zend_Controller_Front` übergeben. Wenn der erste Controller durch die Rückgabe eines neuen Tokens angezeigt hat, dass ein weiterer Controller ausgeführt werden soll, wird der Durchlauf fortgesetzt und ein weiterer Dispatcher Prozess wird durchlaufen. Andernfalls endet der Prozess.

### 4.1.2. Routing Prozess

Bevor dein erster Controller erstellt werden kann, musst du die Funkktionsweise des Routing Prozesses verstehen, wie er in `Zend_Controller_Router` implementiert worden ist. Denke daran, dass der Ablauf unterteilt ist in das Routing, das nur einmal ausgeführt wird, und das Dispatching, welches danach in einer Schleife durchlaufen wird.

`Zend_Controller_Front` ruft `Zend_Controller_Router` auf, um die URI auf einen Controller (und eine Aktion in diesem Controller) abzubilden. `Zend_Controller_Router` nimmt die URI und zerteilt sie in ein `Zend_Controller_Dispatcher_Token` Objekt, welches an den Dispatcher (`Zend_Controller_Dispatcher`) übergeben wird.

Der Router verwendet eine sehr einfache Zuordnung, um den Namen des Controllers und den Namen der Aktion innerhalb dieses Controllers zu ermitteln.

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

Beachte im obigen Beispiel, dass das erste Segment immer den Namen des Controllers und das zweite Segment immer den Name der Aktion enthält.

Optional können in der URI auch Parameter definiert werden, die an den Controller übergeben werden. Diese haben die Form eines Schlüssel/Wert Paares:

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

Wenn im `/controller/` Teil der URI nichts enthalten ist, wird dieser Teil zu "`index`". Wenn im `/action/` Teil der URI nichts enthalten ist, wird dieser Teil ebenfalls zu `index`. Diese Beispiele erläutern dies:

    http://framework.zend.com/roadmap/future/
    Controller: roadmap
    Action    : future

    http://framework.zend.com/roadmap/
    Controller: roadmap
    Action    : index

    http://framework.zend.com/
    Controller: index
    Action    : index

| Anmerkung
Wir entwickeln momentan einen neuen Router mit einer Engine für das URI Rewriting, welche flexiblere Möglichkeiten bietet als die aktuell im Router vorhandene. Diese wird in naher Zukunft in einer Vorschauversion enthalten sein.

Der Name des Controllers und der Aktion innerhalb dieses Controllers sowie weitere optionale Parameter werden in einem `Zend_Controller_Dispatcher_Token` gekapselt. Dieser Token wird an `Zend_Controller_Front` zurückgegeben, der in die Dispatcher Schleife übergeht. Einmal in der Dispatcher Schleife wird der Token an den `Zend_Controller_Dispatcher` übergeben.

### 4.1.3. Dispatcher Token

Der Dispatcher Token ist ein einfaches Objekt, das zwischen `Zend_Controller_Front` und den Klassen übergeben wird, welche die Router und Dispatcher Interfaces implementieren. Es enthalt eine Definition des Controllers, eine Aktion und Parameter, die an die Aktion übergeben werden.

- Auf den Names des Controllers wird über `getControllerName()` und `setControllerName()` zurückgegriffen.

- Auf den Namen der Aktion innerhalb des Controllers wird über `getActionName()` und `setActionName()` zurückgegriffen.

- Auf die Parameter, die an diese Aktion übergeben wurden und die sich in einem assoziativen Array mit Schlüssel/Wert Paaren befinden, kann über `getParams()` und `setParams()` zurückgegriffen werden.

### 4.1.4. Dispatcher Prozess

Das Dispatching ist der Prozess, bei dem ein `Zend_Controller_Dispatcher_Token` übernommen wird, die dort enthaltenen Informationen (der Name eines Controllers, einer Aktion sowie optionaler Parameter) extrahiert werden und dann ein Controller instanziiert sowie eine Aktion dieses Controllers aufgerufen wird.

Zurück |  | Weiter
3.4. Zend_Config_Xml | Zum Anfang | 4.2. Erste Schritte