| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415 |
- <?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 "<Module>_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>
|