| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.basics">
- <title>Zend_Controller Grundlagen</title>
- <para>
- Das <classname>Zend_Controller</classname> 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 <classname>Zend_Controller</classname> aufbauen, gemeinsame Konventionen befolgen und
- einen ähnlichen Code Aufbau verwenden.
- </para>
- <para>
- Das folgende Diagramm zeigt den Workflow und der folgende Text beschreibt das
- Zusammenspiel im Detail:
- </para>
- <para>
- <inlinegraphic width="483" scale="100" align="center" valign="middle"
- fileref="figures/zend.controller.basics.png" format="PNG" />
- </para>
- <para>
- Der <classname>Zend_Controller</classname> 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.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <classname>Zend_Controller_Front</classname> steuert den gesamten Ablauf des
- <classname>Zend_Controller</classname> Systems. Es ist eine Interpretation des
- FrontController Entwurfsmusters. <classname>Zend_Controller_Front</classname>
- verarbeitet alle Anfragen, die der Server erhält, und ist letztendlich dafür
- verantwortlich, die Anfragen an die ActionController
- (<classname>Zend_Controller_Action</classname>) zu delegieren.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Request_Abstract</classname> (oft als das
- <emphasis>Request Objekt</emphasis> 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
- <classname>Zend_Controller_Dispatcher</classname> 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.
- </para>
- <para>
- Standardmäßig wird <classname>Zend_Controller_Request_Http</classname>
- verwendet, welches den Zugriff auf die komplette <acronym>HTTP</acronym>
- Anfrageumgebung ermöglicht.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Router_Interface</classname> 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
- <classname>Zend_Controller_Dispatcher_Standard</classname> verarbeitet wird. Das
- Routing wird nur einmal ausgeführt: wenn die Anfrage erhalten wird und
- bevor der erste Controller aufgerufen wird.
- </para>
- <para>
- Der Standardrouter <classname>Zend_Controller_Router_Rewrite</classname> nimmt
- den <acronym>URI</acronym> Endpunkt entgegen, der in
- <classname>Zend_Controller_Request_Http</classname> angegeben ist, und zerlegt
- ihn in einen Controller, eine Aktion und die Parameter basierend auf den
- Pfadinformationen der <acronym>URL</acronym>. Zum Beispiel würde die
- <acronym>URL</acronym> <filename>http://localhost/foo/bar/key/value</filename>
- übersetzt, um den <emphasis>foo</emphasis> Controller und die
- <emphasis>bar</emphasis> Aktion zu verwenden und einen Parameter
- <emphasis>key</emphasis> mit dem Wert <emphasis>value</emphasis> anzugeben.
- </para>
- <para>
- <classname>Zend_Controller_Router_Rewrite</classname> kann auch für beliebige
- Pfade verwendet werden; man beachte <link linkend="zend.controller.router">die
- Rewrite Router Dokumentation</link> für weitere Informationen.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Dispatcher_Interface</classname> 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.
- </para>
- <para>
- 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 (<type>Boolean</type>
- <constant>TRUE</constant>) im Request Objekt beendet wird, wird der Prozess
- beendet.
- </para>
- <para>
- Der Standarddispatcher ist
- <classname>Zend_Controller_Dispatcher_Standard</classname>. Er definiert
- Controller als MixedCasedKlassen, die auf das Wort Controller enden, und
- Aktionsmethoden als camelCasedMethoden, die auf das Wort Action enden:
- <methodname>SomeFooController::barAction()</methodname>. In diesem Fall wird
- auf den Controller über <emphasis>foo</emphasis> und auf die Aktion über
- <emphasis>bar</emphasis> zugegriffen.
- </para>
- <note>
- <title>Konventionen von Namens-Schreibweisen</title>
- <para>
- 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.
- </para>
- <para>
- 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).
- </para>
- <para>
- Als Beispiel, wenn man zur Aktion in
- <methodname>FooBarController::bazBatAction()</methodname> kommen will, muß
- zu Ihr mit der URL as <filename>/foo-bar/baz-bat</filename> oder
- <filename>/foo.bar/baz.bat</filename> referiert werden.
- </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Action</classname> ist die elementare Controller
- Komponente. Jeder Controller ist eine einzelne Klasse, welche die
- <classname>Zend_Controller_Action</classname> Klasse erweitert und Methoden für
- die Aktionen enthält.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Response_Abstract</classname> 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.
- </para>
- <para>
- Die Standard Response Klasse ist
- <classname>Zend_Controller_Response_Http</classname>, welches in einer
- <acronym>HTTP</acronym> Umgebung verwendet werden kann.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Der Ablauf vom <classname>Zend_Controller</classname> ist relativ einfach. Eine Anfrage
- wird vom <classname>Zend_Controller_Front</classname> empfangen, der wiederum
- <classname>Zend_Controller_Router_Rewrite</classname> aufruft, um zu ermitteln, welcher
- Controller (und welche Aktion in dem Controller) ausgeführt werden soll.
- <classname>Zend_Controller_Router_Rewrite</classname> zerteilt die <acronym>URI</acronym>
- um den Namen des Controllers und der Aktion für den Request zu setzen.
- <classname>Zend_Controller_Front</classname> durchläuft dann eine Dispatcher Schleife. Er
- ruft <classname>Zend_Controller_Dispatcher_Standard</classname> 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 <classname>Zend_Controller_Front</classname> ü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.
- </para>
- </sect1>
|