Kapitel 4. Zend_Controller

Inhaltsverzeichnis

4.1. Überblick
4.1.1. Einführung
4.1.2. Routing Prozess
4.1.3. Dispatcher Token
4.1.4. Dispatcher Prozess
4.2. Erste Schritte
4.2.1. Einführung
4.2.2. Server Konfiguration
4.2.3. Ladedatei
4.2.4. Verzeichnisstruktur
4.2.5. IndexController
4.3. Subclassing
4.3.1. Einführung
4.3.2. Konventionen
4.3.3. Router Interface
4.3.4. Dispatcher Interface
4.4. Plugins
4.4.1. Einführung

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 eine^r 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] 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.