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

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

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

        <para>
            Obwohl die meisten grundsätzlichen Funktionalitäten die gleichen bleiben und alle
            dokumentierten Funktionalitäten die gleichen bleiben gibt es doch ein spezielles
            <emphasis>undokumentiertes</emphasis> "Feature" das geändert wurde.
        </para>

        <para>
            Wenn <acronym>URL</acronym>s geschrieben werden besteht der dokumentierte Weg darin die
            Aktionsnamen camelCased mit einem Trennzeichen zu schreiben; diese sind normalerweise
            '.' oder '-', können aber im Dispatcher konfiguriert werden. Der Dispatcher ändert den
            Aktionsnamen intern auf Kleinschreibung und verwendet diese Trennzeichen um die
            Aktionsmethode wieder zu bauen indem er sie camelCase schreibt. Trotzdem, weil
            <acronym>PHP</acronym> Funktionen nicht unabhängig von der Schreibweise sind,
            <emphasis>könnte</emphasis> man <acronym>URL</acronym>s mit camelCase schreiben und der
            Dispatcher würde diese auf den gleichen Platz auflösen. Zum Beispiel, 'camel-cased'
            würde durch den Dispatcher zu 'camelCasedAction' werden; trotzdem, durch den Fall der
            unabhängigen Schreibweise in <acronym>PHP</acronym>, würden beide die selbe Methode
            ausführen.
        </para>

        <para>
            Das führt zu Problemen mit dem ViewRenderer wenn View Skripte aufgelöst werden. Der
            kanonische, dokumentierte Weg besteht darin das alle Trennzeichen zu Bindestrichen
            umgewandelt und die Wörter kleingeschrieben werden. Das erzeugt eine semantische
            Bindung zwischen Aktionen und View Skripten, und die Normalisierung stellt sicher
            das die Skripte gefunden werden. Trotzdem, wenn die Aktion 'camelCased' aufgerufen und
            aufgelöst wird, ist das Trennzeichen nicht mehr vorhanden, und der ViewRenderer
            versucht einen anderen Ort aufzulösen -- <filename>camelcased.phtml</filename> statt
            <filename>camel-cased.phtml</filename>.
        </para>

        <para>
            Einige Entwickler hängen an diesem "Feature", welches nie angedacht war. Verschiedene
            Änderungen im 1.5.0 Baum, führen dazu das der ViewRenderer diese Pfade nicht länger
            auflöst; die semantische Bindung wird nun erzwungen. Ale erstes, erzwingt der
            Dispatcher nun die Groß-/Kleinschreibung in Aktionsnamen. Das bedeutet dass das
            hinleiten zu eigenen Aktionen über die URL durch Verwendung von camelCase nicht länger
            auf die gleiche Methode aufgelöst wird wie mit Trennzeichen (z.B. 'camel-casing').
            Das führt dazu das der ViewRenderer jetzt nur mehr zeichen-getrennte Aktionen
            honoriert wenn er View Skripte auflöst.
        </para>

        <para>
            Wenn man findet das man auf dieses "Feature" nicht verzichten kann gibt es mehrere
            Optionen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    Beste Option: Die View Skripte umbenennen. Vorteile: zukünftige Kompatibilität.
                    Nachteile: Wenn man viele View Skripte hat die auf dem vorigen aufbauen führt
                    das, unerwarteter Weise, zu vielen Umbenennungen die durchgeführt werden müssen.
                </para>
            </listitem>

            <listitem>
                <para>
                    Zweitbeste Option: Der ViewRenderer delegiert nun die Auflösung von View
                    Skripten zu <classname>Zend_Filter_Inflector</classname>; man kann die Regeln
                    des Inflectors ändern damit er nicht länger die Wörter der Aktion mit einem
                    Bindestrich trennt:
                </para>

                <programlisting language="php"><![CDATA[
$viewRenderer =
    Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$inflector = $viewRenderer->getInflector();
$inflector->setFilterRule(':action', array(
    new Zend_Filter_PregReplace(
        '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
        ''
    ),
    'StringToLower'
));
]]></programlisting>

                <para>
                    Der obige Code ändert den Inflector so, das er Wörter nicht länger mit einem
                    Bindestrich trennt; Es kann auch gewünscht sein den 'StringToLower' Filter zu
                    entfernen man die aktuellen View Skripte camelCased benannt haben
                    <emphasis>will</emphasis>.
                </para>

                <para>
                    Wenn die Umbenennung der View Skripte zu aufwendig oder Zeitintensiv ist, dann
                    ist das die beste Option wenn man die Zeit hierfür findet.
                </para>
            </listitem>

            <listitem>
                <para>
                    Die am wenigsten zu empfehlende Option: Man kann den Dispatcher dazu zwingen
                    camelCase Aktionsnamen mit einem neuen Front Controller Flag
                    <property>useCaseSensitiveActions</property> zu bearbeiten:
                </para>

                <programlisting language="php"><![CDATA[
$front->setParam('useCaseSensitiveActions', true);
]]></programlisting>

                <para>
                    Das erlaubt es camelCase in der URL zu verwenden uns es trotzdem auf die
                    gleiche Aktion aufzulösen wie wenn Trennzeichen verwendet worden wären. Das
                    bedeutet dass das Originale Problem trotzdem durchschlägt; es kann notwendig
                    sein die zweite Option von oben zusätzlich zu verwenden um sicherzustellen
                    das die Dinge in allen Variationen funktionieren.
                </para>

                <para>
                    Man sollte auch beachten das die Verwendung dieses Flags eine Notiz auslöst,
                    das dessen Verwendung nicht mehr durchgeführt werden sollte.
                </para>
            </listitem>
        </itemizedlist>
    </sect2>
</sect1>
