<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="migration.06">
    <title>Zend Framework 0.6</title>

    <para>
        Wenn man von einem älteren Release auf Zend Framework 0.6 oder höher hochrüstet sollte
        man die folgenden Migrations Hinweise beachten.
    </para>

    <sect2 id="migration.06.zend.controller">
        <title>Zend_Controller</title>

        <para>
            Die grundlegende Verwendung der <acronym>MVC</acronym> Komponenten hat sich nicht
            verändert; man kann immer noch das folgende machen:
        </para>

        <programlisting language="php"><![CDATA[
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('/path/to/controllers');
]]></programlisting>

        <programlisting language="php"><![CDATA[
/* -- Erstelle einen Router -- */
$router = new Zend_Controller_RewriteRouter();
$router->addRoute('user',
                  'user/:username',
                  array('controller' => 'user', 'action' => 'info')
);

/* -- Setze ihn im Controller -- */
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);

/* -- Setze da Controller Verzeichnis und starte die Verarbeitung -- */
$ctrl->setControllerDirectory('/path/to/controllers');
$ctrl->dispatch();
]]></programlisting>

        <para>
            Wir empfehlen die Verwendung des Response Objektes, um Inhalte und Header zu sammeln.
            Dies erlaubt den flexibleren Wechsel von Ausgabeformaten (z.B. <acronym>JSON</acronym>
            oder <acronym>XML</acronym> statt <acronym>XHTML</acronym>) in deiner Applikation.
            Standardmäßig verarbeitet <methodname>dispatch()</methodname> die Antwort, sendet
            Header und gibt die Inhalte aus. Man kann den Front Controller auch auffordern, die
            Antwort durch <methodname>returnResponse()</methodname> zurückzugeben und die Antwort
            dann auf eigene Weise ausgeben. Eine zukünftige Version des Front Controllers könnte
            die Verwendung des Response Objektes durch Output Buffering erzwingen.
        </para>

        <para>
            Es gibt viele weitere zusätzliche Funktionalitäten, welche die vorherige
            <acronym>API</acronym> erweitern. Diese sind in der Dokumentation aufgeführt.
        </para>

        <para>
            Die meisten Änderungen, die man beachten muss, betreffen das Erweitern der diversen
            Komponenten. Die wichtigsten davon sind:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>Zend_Controller_Front::dispatch()</methodname> fängt standardmäßig
                    die Ausnahmen im Response Objekt ab und gibt sie nicht aus, um sicherzugehen,
                    dass keine sensitiven Systeminformationen ausgegeben werden. Man kann dies auf
                    mehrere Arten überschreiben:
                </para>

                <itemizedlist>
                    <listitem>
                        <para>
                            Setzen von <methodname>throwExceptions()</methodname> im Front
                            Controller:
                        </para>

                        <programlisting language="php"><![CDATA[
$front->throwExceptions(true);
]]></programlisting>
                    </listitem>

                    <listitem>
                        <para>
                            Setzen von <methodname>renderExceptions()</methodname> im Response
                            Objekt:
                        </para>

                        <programlisting language="php"><![CDATA[
$response->renderExceptions(true);
$front->setResponse($response);
$front->dispatch();

// oder:
$front->returnResponse(true);
$response = $front->dispatch();
$response->renderExceptions(true);
echo $response;
]]></programlisting>
                    </listitem>
                </itemizedlist>
            </listitem>

            <listitem>
                <para>
                    <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
                    akzeptiert und gibt nun ein <link
                        linkend="zend.controller.request">Anfrage Objekt</link> anstelle eines
                    Dispatcher Token zurück.
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>Zend_Controller_Router_Interface::route()</methodname>
                    akzeptiert und gibt nun ein <link
                        linkend="zend.controller.request">Anfrage Objekt</link> anstelle eines
                    Dispatcher Token zurück.
                </para>
            </listitem>

            <listitem>
                <para><classname>Zend_Controller_Action</classname> Änderungen beinhalten:</para>

                <itemizedlist>
                    <listitem>
                        <para>
                            Der Konstruktur akzeptiert nun genau drei Argumente,
                            <classname>Zend_Controller_Request_Abstract</classname>
                            <varname>$request</varname>,
                            <classname>Zend_Controller_Response_Abstract</classname>
                            <varname>$response</varname>, und
                            <type>Array</type> <varname>$params</varname> (Optional).
                            <methodname>Zend_Controller_Action::__construct()</methodname>
                            verwendet diese, um die Request, Response und invokeArgs Eigenschaften
                            für das Objekt zu setzen, und beim Überschreiben des Konstrukturs
                            sollte man dies ebenfalls tun. Besser ist es, die
                            <methodname>init()</methodname> Methode zu verwenden, um jedwede
                            Instanzkonfiguration durchzuführen, weil diese Methode als letzte
                            Methode des Konstrukturs aufgerufen wird.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <methodname>run()</methodname> ist nicht länger als final definiert,
                            wird aber auch nicht länger vom Front Controller verwendet; sein
                            einziger Zweck ist, dass die Klasse auch als Page Controller verwendet
                            werden kann. Sie nimmt nun zwei optionale Argument an, ein
                            <classname>Zend_Controller_Request_Abstract</classname>
                            <varname>$request</varname> und ein
                            <classname>Zend_Controller_Response_Abstract</classname>
                            <varname>$response</varname>.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <methodname>indexAction()</methodname> muss nicht mehr länger definiert
                            werden, aber wird als Standardaktion empfohlen. Dies erlaubt dem
                            RewriteRouter und den Action Controllern andere Standardaktionsmethoden
                            zu definieren.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <methodname>__call()</methodname> sollte überschrieben werden, um jede
                            undefinierte Aktion automatisch verarbeiten zu können.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <methodname>_redirect()</methodname> nimmt nun ein optionales zweites
                            Argument entgegen, den <acronym>HTTP</acronym> Code, der mit dem
                            Redirect zurückgegeben werden soll, und ein optionales drittes Argument
                            <varname>$prependBase</varname>, das angibt, dass die im Request Objekt
                            registrierte Basis URL der übergebenen <acronym>URL</acronym> voran
                            gestellt werden soll.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            Die <varname>$_action</varname> Eigenschaft wird nicht mehr gesetzt.
                            Diese Eigenschaft war ein
                            <classname>Zend_Controller_Dispatcher_Token</classname>, der in der
                            aktuellen Inkarnation nicht mehr länger existiert. Der einzige Zweck
                            des Tokens war, Informationen über angeforderte Controller, Aktion und
                            <acronym>URL</acronym> Parameter bereit zu stellen. Diese Infrmationen
                            ist nun im Request Objekt verfügbar und kann wie folgt abgerufen
                            werden:
                        </para>

                        <programlisting language="php"><![CDATA[
// Hole den angeforderten Controllernamen
// Der Zugriff erfolgte bisher über: $this->_action->getControllerName().
// Das Beispiel unten verwendet getRequest(), obwohl man auch direkt auf die
// $_request Eigenschaft zugreifen kann; die Verwendung von getRequest() wird
// empfohlen, da eine Elternklasse den Zugriff auf das Request Objekt
// überschreiben könnte
$controller = $this->getRequest()->getControllerName();

// Hole den angeforderten Aktionsnamen
// Der Zugriff erfolgte bisher über: $this->_action->getActionName().
$action = $this->getRequest()->getActionName();

// Hole die Anfrageparameter
// Dies hat sich nicht verändert; die _getParams() und _getParam()
// Methoden leiten nun einfach auf das Request Objekt weiter.
$params = $this->_getParams();
// fordere den 'foo' Parameter an und verwende
// 'default', wenn kein Standardwert gefunden werden kann
$foo = $this->_getParam('foo', 'default');
]]></programlisting>
                    </listitem>

                    <listitem>
                        <para>
                            <methodname>noRouteAction()</methodname> wurde entfernt. Der geeignete
                            Weg, um nicht vorhandene Aktionsmethoden abzufangen, wenn man sie an
                            eine Standardaktion weiter leiten möchte, sollte die Verwendung von
                            <methodname>__call()</methodname> sein:
                        </para>

                        <programlisting language="php"><![CDATA[
public function __call($method, $args)
{
    // Wenn eine nicht vorhandene 'Action' Methode angefordert wurde,
    // leite auf die Standard Aktionsmethode um:
    if ('Action' == substr($method, -6)) {
        return $this->defaultAction();
    }

    throw new Zend_Controller_Exception('Invalid method called');
}
]]></programlisting>
                    </listitem>
                </itemizedlist>
            </listitem>

            <listitem>
                <para>
                    <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname> wurde
                    entfernt. Stattdessen soll
                    <methodname>Zend_Controller_Front::setBaseUrl()</methodname> verwendet werden
                    (oder <methodname>Zend_Controller_Request_Http::setBaseUrl()</methodname>, wenn
                    die Request Klasse verwendet wird).
                </para>
            </listitem>

            <listitem>
                <para>
                    <classname>Zend_Controller_Plugin_Interface</classname> wurde durch
                    <classname>Zend_Controller_Plugin_Abstract</classname> ersetzt. Alle Methoden
                    nehmen nun ein <link linkend="zend.controller.request">Request Objekt</link>
                    statt eines Dispatcher Tokens entgegen bzw. geben es zurück.
                </para>
            </listitem>
        </itemizedlist>
    </sect2>
</sect1>
