Zend_Controller Grundlagen
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
(oder Klasse) und eine Aktionsmethode in dieser Controller Klasse 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 ( Boolean
TRUE) im Request Objekt beendet wird, wird der Prozess
beendet.
Der Standarddispatcher ist
Zend_Controller_Dispatcher_Standard. Er definiert
Controller als MixedCasedKlassen, die auf das Wort Controller enden, und
Aktionsmethoden als camelCasedMethoden, die auf das Wort Action enden:
SomeFooController::barAction(). In diesem Fall wird
auf den Controller über foo und auf die Aktion über
bar zugegriffen.
Note: Konventionen von Namens-Schreibweisen
Da Menschen grundsätzlich inkonsistent sind im Behandeln und der
Gründlichkeit beim Tippen von Links, normalisiert Zend Framework die Pfad
Informationen zur Kleinschreibung. Das beeinflut natürlich wie Controller
und Aktionen benannt werden ... oder wie auf diese in Links referiert werden
kann.
Wenn es gewünscht ist das die eigene Controllerklasse oder
Aktionsmethodenname mehrfache MixedCasedWörter oder camelCasedWörter
enthält, dann müssen diese zu getrennten Wörtern in der URL seperiert
werden, entweder mit einem '-' oder '.' (das zu verwendende Zeichen kann
konfiguriert werden).
Als Beispiel, wenn man zur Aktion in
FooBarController::bazBatAction() kommen will, muß
zu Ihr mit der URL as /foo-bar/baz-bat oder
/foo.bar/baz.bat referiert werden.
-
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.
|
|