| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 18056 -->
- <!-- Reviewed: no -->
- <appendix id="project-structure">
- <title>Vorgeschlagene Struktur für die Projekt Struktur von Zend Framework MVC Anwendungen</title>
- <sect1 id="project-structure.overview">
- <title>Übersicht</title>
- <para>
- Viele Entwickler suchen Hilfe für die beste Projekt Struktur 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 idealste Projektstruktur zu erhalten damit Ihre
- Anweungen ausgeführt werden können und sicher sind. Die standardmäßige Projektstruktur
- stellt sicher das der Entwickler diese Flexibilität zu seiner Verfügung hat.
- </para>
- <para>
- Die folgende Verzeichnisstruktur wurde designt um für komplexe Projekt maximal
- erweiterbar zu sein, wärend Sie ein einfaches Subset von Verzeichnissen und Dateien
- für Projekte mit einfacheren Notwendigkeiten anbietet. Diese Struktur arbeitet 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">Rewrite Konfigurations Guide</link>
- beschrieben, der auch in diesem Anhang enthalten ist.
- </para>
- <para>
- Es ist nicht angedacht das diese Projekt Struktur alle möglichen Notwendigkeiten für
- Zend Framework Projekte unterstützt. Das standardmäßige Projekt Profil welches von
- <classname>Zend_Tool</classname> verwendet wird, reflektiert diese Projekt Struktur.
- Aber Anwendungen mit Notwendigkeiten die nicht von dieser Struktur unterstützt werden,
- sollten ein eigenes Projekt Profil verwenden.
- </para>
- </sect1>
- <sect1 id="project-structure.project">
- <title>Vorgeschlagene Verzeichnis Struktur für Projekte</title>
- <programlisting language="txt"><![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 angeführt.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis><filename>application/</filename></emphasis>: Der Verzeichnis enthält
- die eigene Anwendung. Das wird das <acronym>MVC</acronym> System inkludieren,
- sowie Konfigurationen, verwendete Services, und die eigene Bootstrap Datei.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis><filename>configs/</filename></emphasis>: Das Anwendungsweite
- Konfigurations Verzeichnis.
- </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>MCV</acronym>-basierte Layouts. Da
- <classname>Zend_Layout</classname> ist 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 diese 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
- das 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 Indezes.
- </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 den Zend Framework selbst enthalten; wenn
- dem so ist, würde er 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 das der
- Front Controller ausgeführt wird. Der Web Root 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.
- This directory contains
- maintenance and/or build scripts. Such scripts might include command line,
- cron, or phing build scripts that are not executed at runtime but are part of
- the correct functioning of the application.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><filename>temp/</filename></emphasis>: Das <filename>temp/</filename>
- Verzeichnis wird für vergängliche Anwendungsdaten gesetzt. 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 Verzeichnis Struktur des
- <filename>library/</filename> Verzeichnisses vorgegauckelt wird. Zusätzliche
- funktionale Tests für die eigene Anwendung können geschrieben werden indem die
- Verzeichnis Struktur von <filename>application/</filename> vorgegauckelt wird
- (inklusive der Unterverzeichnisse der Anwendung).
- </para>
- </listitem>
- </itemizedlist>
- </sect1>
- <sect1 id="project-structure.filesystem">
- <title>Modul Struktur</title>
- <para>
- Die Verzeichnis Struktur für Module sollte jene des
- <filename>application/</filename> Verzeichnisses in der vorgeschlagenen Projekt Struktur
- entsprechen:
- </para>
- <programlisting language="xml"><![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
- Verzeichnis Struktur 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 bebündelt 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="xml"><![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 das 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 Minard's
- <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>
|