Das Zend_Controller
System wurde leichtgewichtig, modular und erweiterbar
aufgebaut. Das Design 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.
Das folgende Diagramm zeigt den Workflow und der folgende Texte beschreibt das Zusammenspiel im Detail:
Der Zend_Controller
Ablauf wurde mit Hilfe verschiedener 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 den
Ablauf ausreichend Kenntnisse zu haben.
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_Request_Abstract
(oft als das Request
Objekt
bezeichnet) repräsentiert die Umgebung
der Anfrage und stellt Methoden für das Setzen und Abfragen der Namen für
Controller und Aktion sowie jeder Anfrageparameter bereit. Zusätzlich
behält es die Übersicht darüber, ob die enthaltene Aktion von
Zend_Controller_Dispatcher
verarbeitet wurde oder nicht.
Erweiterungen dieses abstrakten Request Objektes können verwendet werden,
um die gesamte Anfrageumgebung zu kapseln und Routern zu erlauben,
Informationen aus der Anfrageumgebung abzufragen, um die Namen für
Controller und Aktion zu setzen..
Standardmäßig wird Zend_Controller_Request_Http
verwendet,
welches den Zugriff auf die komplette HTTP Anfrageumgebung ermöglicht.
Zend_Controller_Router_Interface
wird verwendet, um Router zu
definieren. Routing ist der Prozess, bei dem die Anfrageumgebung untersucht
wird, um zu ermitteln, welcher Controller und welche Aktion dieses
Controllers diese Anfrage verarbeiten soll. Dieser Controller, diese Aktion
und optionale Parameter werden dann im Request Object gesetzt, das vom
Zend_Controller_Dispatcher_Standard
verarbeitet wird. Das
Routing wird nur einmal ausgeführt: wenn die Anfrage erhalten wird und
bevor der erste Controller aufgerufen wird.
Der Standardrouter Zend_Controller_Router_Rewrite
nimmt den
URI Endpunkt entgegen, der in Zend_Controller_Request_Http
angegeben ist, und zerlegt ihn in einen Controller, eine Aktion und die
Parameter basierend auf den Pfadinformationen der URL. Zum Beispiel würde
die URL http://localhost/foo/bar/key/value
übersetzt, um den
foo
Controller und die bar
Aktion zu verwenden und
einen Parameter key
mit dem Wert value
anzugeben.
Zend_Controller_Router_Rewrite
kann auch für beliebige Pfade
verwendet werden; man beachte die
Rewrite Router Dokumentation für weitere Informationen.
Zend_Controller_Dispatcher_Interface
wird verwendet, um
Dispatcher zu definieren. Dispatching ist der Prozess, den Controller und
die Aktion aus dem Request Objekt abzufragen und auf eine Controller Datei/
Klasse und eine Aktionsmethode in dieser Controller Klasse zu abzubilden.
Wenn der Controller oder die Aktion nicht existieren, ermittelt es den zu
verarbeitenden Standard Controller und Aktion.
Der aktuelle Dispatcher Prozess besteht aus dem Instanzieren der Controller Klasse und dem Aufrufen der Aktionsmethode in dieser Klasse. Anders als das Routing, welches immer nur einmal vorkommt, erfolgt das Dispatching in einer Schleife. Wenn der Verarbeitungsstatus des Request Objektes irgendwann zurück gesetzt wird, wird die Schleife wiederholt und die Aktion aufgerufen, die zu diesem Zeitpunkt im Request Objekt gesetzt ist. Das erste Mal, wenn ein Schleifendurchlauf mit gesetztem Verarbeitungsstatus (boolsches true) im Request Objekt beendet wird, wird der Prozess beendet.
Der Standarddispatcher ist Zend_Controller_Dispatcher_Standard
.
Er definiert Controller als CamelCasedClasses, die auf das Wort Controller
enden, und Aktionsmethoden als camelCasedMethods, die auf das Wort Action
enden: SomeFooController::barAction
. In diesem Fall wird auf
den Controller über somefoo
und auf die Aktion über
bar
zugegriffen.
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.
Zend_Controller_Response_Abstract
definiert eine grundlegende
Response Klasse, um Antworten der Aktion aus den Controllern zu sammeln und
zurück zu geben. Es sammelt sowohl Header als auch Inhalte.
Die Standard Response Klasse ist Zend_Controller_Response_Http
,
welches in einer HTTP Umgebung verwendet werden kann.
Der Ablauf vom Zend_Controller
ist relativ einfach. Eine Anfrage wird vom
Zend_Controller_Front
empfangen, der wiederum
Zend_Controller_Router_Rewrite
aufruft, um zu ermitteln, welcher Controller
(und welche Aktion in dem Controller) ausgeführt werden soll.
Zend_Controller_Router_Rewrite
zerteilt die URI um den Namen des Controllers
und der Aktion für den Request zu setzen. Zend_Controller_Front
durchläuft
dann eine Dispatcher Schleife. Er ruft Zend_Controller_Dispatcher_Standard
auf und übergibt den Request, um den Controller und die Aktion auszuführen, die im Request
spezifiziert wurden (oder verwendet die Standardwerte). Wenn der Controller fertig ist,
wird die Kontrolle wieder an Zend_Controller_Front
übergeben. Wenn der
Controller durch das Zurücksetzen des Dispatch Status des Requests 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.