<?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 Texte 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 deligieren.
            </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>
