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