<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: 19711 -->
<appendix id="project-structure">
    <title>Empfohlene Projektstruktur für Zend Framework MVC Anwendungen</title>

    <sect1 id="project-structure.overview">
        <title>Übersicht</title>

        <para>
            Viele Entwickler suchen Hilfe für die beste Projektstruktur für ein Zend Framework
            Projekt in einer relativ flexiblen Umgebung. Eine "flexible" Umgebung ist eine, in
            welcher der Entwickler seine Dateisysteme und Konfigurationen des Webservers wie
            benötigt manipulieren kann, um die ideale Projektstruktur zu erhalten, damit die
            Anwendungen ausgeführt werden können und sicher sind. Die standardmäßige Projektstruktur
            stellt sicher, dass der Entwickler diese Flexibilität zu seiner Verfügung hat.
        </para>

        <para>
            Die folgende Verzeichnisstruktur ist für komplexe Projekte maximal
            erweiterbar, wärend sie eine einfache Teilmenge von Verzeichnissen und Dateien
            für Projekte mit einfacheren Anforderungen anbietet. Diese Struktur funktioniert auch
            ohne Änderung sowohl für modulare und nicht-modulare Zend Framework Anwendungen. Die
            <filename>.htaccess</filename>-Dateien benötigen <acronym>URL</acronym> Rewrite
            Funktionalität im Web Server wie im
            <link linkend="project-structure.rewrite">Leitfaden für die Rewrite Konfiguration</link>
            beschrieben, der auch in diesem Anhang enthalten ist.
        </para>

        <para>
            Es ist nicht angedacht, dass diese Projektstruktur alle möglichen Anforderungen für
            Zend Framework Projekte unterstützt. Das standardmäßige Projektprofil, welches von
            <classname>Zend_Tool</classname> verwendet wird, reflektiert diese Projektstruktur.
            Aber Anwendungen mit Anforderungen, die nicht von dieser Struktur unterstützt werden,
            sollten ein angepasstes Projektprofil verwenden.
        </para>
    </sect1>

    <sect1 id="project-structure.project">
        <title>Empfohlene Verzeichnisstruktur für Projekte</title>

        <programlisting language="text"><![CDATA[
<project name>/
    application/
        configs/
            application.ini
        controllers/
            helpers/
        forms/
        layouts/
            filters/
            helpers/
            scripts/
        models/
        modules/
        services/
        views/
            filters/
            helpers/
            scripts/
        Bootstrap.php
    data/
        cache/
        indexes/
        locales/
        logs/
        sessions/
        uploads/
    docs/
    library/
    public/
        css/
        images/
        js/
        .htaccess
        index.php
    scripts/
        jobs/
        build/
    temp/
    tests/
]]></programlisting>

        <para>
            Nachfolgend ist der Verwendungszweck für jedes Verzeichnis aufgeführt.
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><filename>application/</filename></emphasis>: Das Verzeichnis enthält
                    die eigentliche Anwendung. Das wird das <acronym>MVC</acronym> System einschliessen,
                    sowie Konfigurationen, verwendete Services, und die eigene Bootstrap Datei.
                </para>

                <itemizedlist>
                    <listitem>
                        <para>
                            <emphasis><filename>configs/</filename></emphasis>: Das anwendungsweite
                            Konfigurationsverzeichnis.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>controllers/</filename></emphasis>,
                            <emphasis><filename>models/</filename></emphasis>, und
                            <emphasis><filename>views/</filename></emphasis>: Diese Verzeichnisse
                            fungieren als Standardcontroller, Modell oder View Verzeichnisse.
                            Diese drei Verzeichnisse im Anwendungsverzeichnis zu haben bietet das
                            beste Layout für das Starten eines einfachen Projekts sowie als Start
                            eines modularen Projekts das globale
                            <filename>controllers/models/views</filename> hat.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>controllers/helpers/</filename></emphasis>: Diese
                            Verzeichnisse enthalten Action Helfer. Action Helfer haben entweder
                            einen Namespace von "<classname>Controller_Helper_</classname>" im
                            Standardmodul oder "&lt;Module&gt;_Controller_Helper" in anderen
                            Modulen.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>layouts/</filename></emphasis>: Dieses Layout
                            Verzeichnis ist für <acronym>MVC</acronym>-basierte Layouts. Da
                            <classname>Zend_Layout</classname> in der Lage ist
                            <acronym>MVC</acronym>- und nicht-<acronym>MVC</acronym>-basierte
                            Layouts zu verstehen, zeigt der Ort dieses Verzeichnisses das Layouts
                            keine 1-zu-1 beziehung zu Controllern haben und unabhängig von
                            Templates in <filename>views/</filename> sind.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>modules/</filename></emphasis>: Module erlauben
                            einem Entwickler ein Set von zusammengehörenden Controllern in eine
                            logisch organisierte Gruppe zu gruppieren. Die Struktur im Modules
                            Verzeichnis würde die Struktur des Application Verzeichnisses haben.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>services/</filename></emphasis>: Dieses Verzeichnis
                            ist für eigene anwendungsspezifische Web-Service Dateien, welche von der
                            eigenen Anwendung angeboten werden, oder für die Implementierung eines
                            <ulink
                                url="http://www.martinfowler.com/eaaCatalog/serviceLayer.html">Service
                                Layers</ulink> für eigene Modelle.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>Bootstrap.php</filename></emphasis>: Diese Datei ist
                            der Eistiegspunkt für die eigene Anwendung, und sollte
                            <classname>Zend_Application_Bootstrap_Bootstrapper</classname>
                            implementieren. Das Ziel dieser Datei ist es, die Anwendung zu starten und
                            Komponenten der Anwendung zur Verfügung zu stellen, indem diese
                            initialisiert werden.
                        </para>
                    </listitem>
                </itemizedlist>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>data/</filename></emphasis>: Dieses Verzeichnis bietet einen
                    Ort an dem Anwendungsdaten gespeichert werden, die angreifbar und möglicherweise
                    temporär sind. Die Veränderung von Daten in diesem Verzeichnis kann dazu führen,
                    dass die Anwendung fehlschlägt. Die Informationen in diesem Verzeichnis können,
                    oder auch nicht, in ein Subversion Repository übertragen werden. Beispiele von
                    Dingen in diesem Verzeichnis sind Session Dateien, Cache Dateien, SQLite
                    Datenbanken, Logs und Indizes.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>docs/</filename></emphasis>: Dieses Verzeichnis enthält die
                    Dokumentation, entweder erzeugt oder direkt bearbeitet.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>library/</filename></emphasis>: Dieses Verzeichnis ist für
                    übliche Bibliotheken, von denen die Anwendung abhängt, und es sollte im
                    <property>include_path</property> von <acronym>PHP</acronym> sein. Entwickler
                    sollten den Bibliotheks-Code ihrer Anwendung in diesem Verzeichnis, unter einem
                    eindeutigen Namespace platzieren, und den Richtlinien folgen, die im Handbuch von
                    <acronym>PHP</acronym> unter <ulink
                        url="http://www.php.net/manual/de/userlandnaming.php">Userland Naming
                        Guide</ulink> beschrieben sind, sowie denen, die von Zend selbst beschrieben
                    sind. Dieses Verzeichnis kann auch das Zend Framework selbst enthalten; wenn
                    dem so ist, würde es unter <filename>library/Zend/</filename> platziert werden.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>public/</filename></emphasis>: Dieses Verzeichnis enthält
                    alle öffentlichen Dateien für die eigene Anwendung.
                    <filename>index.php</filename> konfiguriert und startet
                    <classname>Zend_Application</classname>, welche seinerseits die Datei
                    <filename>application/Bootstrap.php</filename> startet, was dazu führt, dass der
                    Front Controller ausgeführt wird. Das DocumentRoot des Web Server sollte
                    typischerweise auf dieses Verzeichnis gesetzt sein.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>scripts/</filename></emphasis>: Dieses Verzeichnis enthält
                    Maintenance und/oder Build Skripte. Solche Skripte können Commandline, Cron oder
                    Phing Build Skripte enthalten, die nicht wärend der Laufzeit ausgeführt werden,
                    aber Teil für das korrekte Funktionieren der Anwendung sind.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>temp/</filename></emphasis>: Das <filename>temp/</filename>
                    Verzeichnis wird für vergängliche Anwendungsdaten verwendet. Diese Information
                    würde typischerweise nicht im SVN Repository der Anwendung gespeichert werden.
                    Wenn Daten im <filename>temp/</filename> Verzeichnis gelöscht werden, sollten
                    Anwendungsen dazu in der Lage sein, weiterhin zu laufen, wärend das möglicherweise
                    die Geschwindigkeit reduziert bis die Daten wieder gespeichert oder neu
                    gecacht sind.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>tests/</filename></emphasis>: Dieses Verzeichnis enthält
                    Anwendungstests. Diese würden hand-geschrieben sein, PHPUnit Tests, Selenium-RC
                    basierte Tests oder basierend auf anderen Test Frameworks. Standardmäßig kann
                    Library Code getestet werden, indem die Verzeichnisstruktur des
                    <filename>library/</filename> Verzeichnisses vorgegaukelt wird. Zusätzliche
                    funktionale Tests für die eigene Anwendung können geschrieben werden, indem die
                    Verzeichnisstruktur von <filename>application/</filename> vorgegaukelt wird
                    (inklusive der Unterverzeichnisse der Anwendung).
                </para>
            </listitem>
        </itemizedlist>
    </sect1>

    <sect1 id="project-structure.filesystem">
        <title>Modul-Struktur</title>

        <para>
            Die Verzeichnisstruktur für Module sollte jener des
            <filename>application/</filename> Verzeichnisses in der vorgeschlagenen Projektstruktur
            entsprechen:
        </para>

        <programlisting language="text"><![CDATA[
<modulename>/
    configs/
        application.ini
    controllers/
        helpers/
    forms/
    layouts/
        filters/
        helpers/
        scripts/
    models/
    services/
    views/
        filters/
        helpers/
        scripts/
    Bootstrap.php
]]></programlisting>

        <para>
            Der Zweck dieses Verzeichnisse bleibt exakt der gleiche wie der für die vorgeschlagene
            Verzeichnisstruktur des Projekts.
        </para>
    </sect1>

    <sect1 id="project-structure.rewrite">
        <title>Leitfaden für die Rewrite Konfiguration</title>

        <para>
            <acronym>URL</acronym> Rewriting ist eine der üblichen Funktionen von
            <acronym>HTTP</acronym> Servern. Trotzdem unterscheiden sich die Regeln und die
            Konfiguration zwischen ihnen sehr stark. Anbei sind einige der üblichen Vorschläge
            für eine Vielzahl der populären Webserver zu finden, die zur der Zeit in der das hier
            geschrieben wurde, vorhanden sind.
        </para>

        <sect2 id="project-structure.rewrite.apache">
            <title>Apache HTTP Server</title>

            <para>
                Alle folgenden Beispiel verwenden <property>mod_rewrite</property>, ein offizielles
                Modul, das zusammen mit Apache kommt. Um es zu verwenden, muss
                <property>mod_rewrite</property> entweder wärend der Zeit des Kompilierens enthalten
                sein, oder als Dynamic Shared Objekt (<acronym>DSO</acronym>) aktiviert werden.
                Konsultieren Sie bitte die
                <ulink url="http://httpd.apache.org/docs/">Apache Dokumentation</ulink> für weitere
                Informationen über Ihre Version.
            </para>

            <sect3 id="project-structure.rewrite.apache.vhost">
                <title>Rewriting innerhalb eines VirtualHost</title>

                <para>
                    Hier ist eine sehr grundsätzliche Definition eines virtuellen Hosts. Diese
                    Regeln leiten alle Anfragen auf <filename>index.php</filename> weiter, ausser
                    wenn eine passende Datei im <property>document_root</property> gefunden wurde.
                </para>

                <programlisting language="text"><![CDATA[
<VirtualHost my.domain.com:80>
    ServerName   my.domain.com
    DocumentRoot /path/to/server/root/my.domain.com/public

    RewriteEngine off

    <Location />
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^.*$ /index.php [NC,L]
    </Location>
</VirtualHost>
]]></programlisting>

                <para>
                    Es ist der Schrägstrich ("/") zu beachten der <filename>index.php</filename>
                    vorangestellt ist; die Regeln für <filename>.htaccess</filename> unterscheiden
                    sich in diesem Punkt.
                </para>
            </sect3>

            <sect3 id="project-structure.rewrite.apache.htaccess">
                <title>Rewriting innerhalb einer .htaccess Datei</title>

                <para>
                    Anbei ist eine einfache <filename>.htaccess</filename> Datei welche
                    <property>mod_rewrite</property> verwendet. Das ist ähnlich der Konfiguration
                    für virtuelle Hosts, ausser dass sie nur die Rewrite Regeln spezifiziert, und der
                    führende Schrägstrich bei <filename>index.php</filename> nicht angegeben wird.
                </para>

                <programlisting language="text"><![CDATA[
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
]]></programlisting>

                <para>
                    Es gibt viele Wege um <property>mod_rewrite</property> zu konfigurieren; wenn
                    man weitere Informationen haben will, dann sollte man in Jayson Minards
                    <ulink url="http://devzone.zend.com/a/70">Blueprint for PHP Applications:
                    Bootstrapping</ulink> sehen.
                </para>
            </sect3>

        </sect2>

        <sect2 id="project-structure.rewrite.iis">
            <title>Microsoft Internet Information Server</title>

            <para>
                Ab Version 7.0 wird <acronym>IIS</acronym> jetzt mit einer standardmäßigen Rewrite
                Engine ausgeliefert. Man kann die folgende Konfiguration verwenden, um die
                entsprechenden Rewrite Regeln zu erstellen.
            </para>

            <programlisting language="xml"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^.*$" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{REQUEST_FILENAME}"
                             matchType="IsFile" pattern=""
                             ignoreCase="false" />
                        <add input="{REQUEST_FILENAME}"
                             matchType="IsDirectory"
                             pattern=""
                             ignoreCase="false" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^.*$" />
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
]]></programlisting>
        </sect2>
    </sect1>
</appendix>
