2
0

project-structure.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 18656 -->
  3. <!-- Reviewed: no -->
  4. <appendix id="project-structure">
  5. <title>Vorgeschlagene Struktur für die Projekt Struktur von Zend Framework MVC Anwendungen</title>
  6. <sect1 id="project-structure.overview">
  7. <title>Übersicht</title>
  8. <para>
  9. Viele Entwickler suchen Hilfe für die beste Projekt Struktur für ein Zend Framework
  10. Projekt in einer relativ flexiblen Umgebung. Eine "flexible" Umgebung ist eine, in
  11. welcher der Entwickler seine Dateisysteme und Konfigurationen des Webservers wie
  12. benötigt manipulieren kann um die idealste Projektstruktur zu erhalten damit Ihre
  13. Anweungen ausgeführt werden können und sicher sind. Die standardmäßige Projektstruktur
  14. stellt sicher das der Entwickler diese Flexibilität zu seiner Verfügung hat.
  15. </para>
  16. <para>
  17. Die folgende Verzeichnisstruktur wurde designt um für komplexe Projekt maximal
  18. erweiterbar zu sein, wärend Sie ein einfaches Subset von Verzeichnissen und Dateien
  19. für Projekte mit einfacheren Notwendigkeiten anbietet. Diese Struktur arbeitet auch
  20. ohne Änderung sowohl für modulare und nicht-modulare Zend Framework Anwendungen. Die
  21. <filename>.htaccess</filename> Dateien benötigen <acronym>URL</acronym> Rewrite
  22. Funktionalität im Web Server wie im
  23. <link linkend="project-structure.rewrite">Rewrite Konfigurations Guide</link>
  24. beschrieben, der auch in diesem Anhang enthalten ist.
  25. </para>
  26. <para>
  27. Es ist nicht angedacht das diese Projekt Struktur alle möglichen Notwendigkeiten für
  28. Zend Framework Projekte unterstützt. Das standardmäßige Projekt Profil welches von
  29. <classname>Zend_Tool</classname> verwendet wird, reflektiert diese Projekt Struktur.
  30. Aber Anwendungen mit Notwendigkeiten die nicht von dieser Struktur unterstützt werden,
  31. sollten ein eigenes Projekt Profil verwenden.
  32. </para>
  33. </sect1>
  34. <sect1 id="project-structure.project">
  35. <title>Vorgeschlagene Verzeichnis Struktur für Projekte</title>
  36. <programlisting language="txt"><![CDATA[
  37. <project name>/
  38. application/
  39. configs/
  40. application.ini
  41. controllers/
  42. helpers/
  43. forms/
  44. layouts/
  45. filters/
  46. helpers/
  47. scripts/
  48. models/
  49. modules/
  50. services/
  51. views/
  52. filters/
  53. helpers/
  54. scripts/
  55. Bootstrap.php
  56. data/
  57. cache/
  58. indexes/
  59. locales/
  60. logs/
  61. sessions/
  62. uploads/
  63. docs/
  64. library/
  65. public/
  66. css/
  67. images/
  68. js/
  69. .htaccess
  70. index.php
  71. scripts/
  72. jobs/
  73. build/
  74. temp/
  75. tests/
  76. ]]></programlisting>
  77. <para>
  78. Nachfolgend ist der Verwendungszweck für jedes Verzeichnis angeführt.
  79. </para>
  80. <itemizedlist>
  81. <listitem>
  82. <para>
  83. <emphasis><filename>application/</filename></emphasis>: Der Verzeichnis enthält
  84. die eigene Anwendung. Das wird das <acronym>MVC</acronym> System inkludieren,
  85. sowie Konfigurationen, verwendete Services, und die eigene Bootstrap Datei.
  86. </para>
  87. <itemizedlist>
  88. <listitem>
  89. <para>
  90. <emphasis><filename>configs/</filename></emphasis>: Das Anwendungsweite
  91. Konfigurations Verzeichnis.
  92. </para>
  93. </listitem>
  94. <listitem>
  95. <para>
  96. <emphasis><filename>controllers/</filename></emphasis>,
  97. <emphasis><filename>models/</filename></emphasis>, und
  98. <emphasis><filename>views/</filename></emphasis>: Diese Verzeichnisse
  99. fungieren als Standardcontroller, Modell oder View Verzeichnisse.
  100. Diese drei Verzeichnisse im Anwendungsverzeichnis zu haben bietet das
  101. beste Layout für das Starten eines einfachen Projekts sowie als Start
  102. eines modularen Projekts das globale
  103. <filename>controllers/models/views</filename> hat.
  104. </para>
  105. </listitem>
  106. <listitem>
  107. <para>
  108. <emphasis><filename>controllers/helpers/</filename></emphasis>: Diese
  109. Verzeichnisse enthalten Action Helfer. Action Helfer haben entweder
  110. einen Namespace von "<classname>Controller_Helper_</classname>" im
  111. Standardmodul oder "&lt;Module&gt;_Controller_Helper" in anderen
  112. Modulen.
  113. </para>
  114. </listitem>
  115. <listitem>
  116. <para>
  117. <emphasis><filename>layouts/</filename></emphasis>: Dieses Layout
  118. Verzeichnis ist für <acronym>MVC</acronym>-basierte Layouts. Da
  119. <classname>Zend_Layout</classname> ist der Lage ist
  120. <acronym>MVC</acronym>- und nicht-<acronym>MVC</acronym>-basierte
  121. Layouts zu verstehen, zeigt der Ort dieses Verzeichnisses das Layouts
  122. keine 1-zu-1 beziehung zu Controllern haben und unabhängig von
  123. Templates in <filename>views/</filename> sind.
  124. </para>
  125. </listitem>
  126. <listitem>
  127. <para>
  128. <emphasis><filename>modules/</filename></emphasis>: Module erlauben
  129. einem Entwickler ein Set von zusammengehörenden Controllern in eine
  130. logisch organisierte Gruppe zu gruppieren. Die Struktur im Modules
  131. Verzeichnis würde die Struktur des Application Verzeichnisses haben.
  132. </para>
  133. </listitem>
  134. <listitem>
  135. <para>
  136. <emphasis><filename>services/</filename></emphasis>: Dieses Verzeichnis
  137. ist für eigene Anwendungsspezifische Web-Service Dateien welche von der
  138. eigenen Anwendung angeboten werden, oder für die Implementierung eines
  139. <ulink
  140. url="http://www.martinfowler.com/eaaCatalog/serviceLayer.html">Service
  141. Layers</ulink> für eigene Modelle.
  142. </para>
  143. </listitem>
  144. <listitem>
  145. <para>
  146. <emphasis><filename>Bootstrap.php</filename></emphasis>: Diese Datei ist
  147. der Eistiegspunkt für die eigene Anwendung, und sollte
  148. <classname>Zend_Application_Bootstrap_Bootstrapper</classname>
  149. implementieren. Das Ziel diese Datei ist es die Anwendung zu starten und
  150. Komponenten der Anwendung zur Verfügung zu stellen indem diese
  151. initialisiert werden.
  152. </para>
  153. </listitem>
  154. </itemizedlist>
  155. </listitem>
  156. <listitem>
  157. <para>
  158. <emphasis><filename>data/</filename></emphasis>: Dieses Verzeichnis bietet einen
  159. Ort an dem Anwendungsdaten gespeichert werden die angreifbar und möglicherweise
  160. temporär sind. Die Veränderung von Daten in diesem Verzeichnis kann dazu führen
  161. das die Anwendung fehlschlägt. Die Informationen in diesem Verzeichnis können,
  162. oder auch nicht, in ein Subversion Repository übertragen werden. Beispiele von
  163. Dingen in diesem Verzeichnis sind Session Dateien, Cache Dateien, SQLite
  164. Datenbanken, Logs und Indezes.
  165. </para>
  166. </listitem>
  167. <listitem>
  168. <para>
  169. <emphasis><filename>docs/</filename></emphasis>: Dieses Verzeichnis enthält die
  170. Dokumentation, entweder erzeugt oder direkt bearbeitet
  171. </para>
  172. </listitem>
  173. <listitem>
  174. <para>
  175. <emphasis><filename>library/</filename></emphasis>: Dieses Verzeichnis ist für
  176. übliche Bibliotheken von denen die Anwendung abhängt, und es sollte im
  177. <property>include_path</property> von <acronym>PHP</acronym> sein. Entwickler
  178. sollten den Bibliotheks-Code Ihrer Anwendung in diesem Verzeichnis, unter einem
  179. eindeutigen Namespace platzieren, und den Richtlinien folgen die im Handbuch von
  180. <acronym>PHP</acronym> unter <ulink
  181. url="http://www.php.net/manual/de/userlandnaming.php">Userland Naming
  182. Guide</ulink> beschrieben sind, sowie denen die von Zend selbst beschrieben
  183. sind.; Dieses Verzeichnis kann auch den Zend Framework selbst enthalten; wenn
  184. dem so ist, würde er unter <filename>library/Zend/</filename> platziert werden.
  185. </para>
  186. </listitem>
  187. <listitem>
  188. <para>
  189. <emphasis><filename>public/</filename></emphasis>: Dieses Verzeichnis enthält
  190. alle öffentlichen Dateien für die eigene Anwendung.
  191. <filename>index.php</filename> konfiguriert und startet
  192. <classname>Zend_Application</classname>, welche seinerseits die Datei
  193. <filename>application/Bootstrap.php</filename> startet, was dazu führt das der
  194. Front Controller ausgeführt wird. Der Web Root des Web Server sollte
  195. typischerweise auf dieses Verzeichnis gesetzt sein.
  196. </para>
  197. </listitem>
  198. <listitem>
  199. <para>
  200. <emphasis><filename>scripts/</filename></emphasis>: Dieses Verzeichnis enthält
  201. Maintenance und/oder Build Skripte. Solche Skripte können Commandline, Cron oder
  202. Phing Build Skripte enthalten die nicht wärend der Laufzeit ausgeführt werden,
  203. aber Teil für das korrekte Funktionieren der Anwendung sind.
  204. This directory contains
  205. maintenance and/or build scripts. Such scripts might include command line,
  206. cron, or phing build scripts that are not executed at runtime but are part of
  207. the correct functioning of the application.
  208. </para>
  209. </listitem>
  210. <listitem>
  211. <para>
  212. <emphasis><filename>temp/</filename></emphasis>: Das <filename>temp/</filename>
  213. Verzeichnis wird für vergängliche Anwendungsdaten gesetzt. Diese Information
  214. würde typischerweise nicht im SVN Repository der Anwendung gespeichert werden.
  215. Wenn Daten im <filename>temp/</filename> Verzeichnis gelöscht werden, sollten
  216. Anwendungsen dazu in der Lage sein weiterhin zu laufen wärend das möglicherweise
  217. die Geschwindigkeit reduziert bis die Daten wieder gespeichert oder neu
  218. gecacht sind.
  219. </para>
  220. </listitem>
  221. <listitem>
  222. <para>
  223. <emphasis><filename>tests/</filename></emphasis>: Dieses Verzeichnis enthält
  224. Anwendungstests. Diese würden hand-geschrieben sein, PHPUnit Tests, Selenium-RC
  225. basierte Tests oder basierend auf anderen Test Frameworks. Standardmäßig kann
  226. Library Code getestet werden indem die Verzeichnis Struktur des
  227. <filename>library/</filename> Verzeichnisses vorgegauckelt wird. Zusätzliche
  228. funktionale Tests für die eigene Anwendung können geschrieben werden indem die
  229. Verzeichnis Struktur von <filename>application/</filename> vorgegauckelt wird
  230. (inklusive der Unterverzeichnisse der Anwendung).
  231. </para>
  232. </listitem>
  233. </itemizedlist>
  234. </sect1>
  235. <sect1 id="project-structure.filesystem">
  236. <title>Modul Struktur</title>
  237. <para>
  238. Die Verzeichnis Struktur für Module sollte jene des
  239. <filename>application/</filename> Verzeichnisses in der vorgeschlagenen Projekt Struktur
  240. entsprechen:
  241. </para>
  242. <programlisting language="xml"><![CDATA[
  243. <modulename>/
  244. configs/
  245. application.ini
  246. controllers/
  247. helpers/
  248. forms/
  249. layouts/
  250. filters/
  251. helpers/
  252. scripts/
  253. models/
  254. services/
  255. views/
  256. filters/
  257. helpers/
  258. scripts/
  259. Bootstrap.php
  260. ]]></programlisting>
  261. <para>
  262. Der Zweck dieses Verzeichnisse bleibt exakt der gleiche wie der für die vorgeschlagene
  263. Verzeichnis Struktur des Projekts.
  264. </para>
  265. </sect1>
  266. <sect1 id="project-structure.rewrite">
  267. <title>Leitfaden für die Rewrite Konfiguration</title>
  268. <para>
  269. <acronym>URL</acronym> Rewriting ist eine der üblichen Funktionen von
  270. <acronym>HTTP</acronym> Servern. Trotzdem unterscheiden sich die Regeln und die
  271. Konfiguration zwischen Ihnen sehr stark. Anbei sind einige der üblichen Vorschläge
  272. für eine Vielzahl der populären Webserver zu finden, die zur der Zeit in der das hier
  273. geschrieben wurde, vorhanden sind.
  274. </para>
  275. <sect2 id="project-structure.rewrite.apache">
  276. <title>Apache HTTP Server</title>
  277. <para>
  278. Alle folgenden Beispiel verwenden <property>mod_rewrite</property>, ein offizielles
  279. Modul das bebündelt mit Apache kommt. Um es zu verwenden muss
  280. <property>mod_rewrite</property> entweder wärend der Zeit des Kompilierens enthalten
  281. sein, oder als Dynamic Shared Objekt (<acronym>DSO</acronym>) aktiviert werden.
  282. Konsultieren Sie bitte die
  283. <ulink url="http://httpd.apache.org/docs/">Apache Dokumentation</ulink> für weitere
  284. Informationen über Ihre Version.
  285. </para>
  286. <sect3 id="project-structure.rewrite.apache.vhost">
  287. <title>Rewriting innerhalb eines VirtualHost</title>
  288. <para>
  289. Hier ist eine sehr grundsätzliche Definition eines virtuellen Hosts. Diese
  290. Regeln leiten alle Anfragen auf <filename>index.php</filename> weiter, ausser
  291. wenn eine passende Datei im <property>document_root</property> gefunden wurde.
  292. </para>
  293. <programlisting language="xml"><![CDATA[
  294. <VirtualHost my.domain.com:80>
  295. ServerName my.domain.com
  296. DocumentRoot /path/to/server/root/my.domain.com/public
  297. RewriteEngine off
  298. <Location />
  299. RewriteEngine On
  300. RewriteCond %{REQUEST_FILENAME} -s [OR]
  301. RewriteCond %{REQUEST_FILENAME} -l [OR]
  302. RewriteCond %{REQUEST_FILENAME} -d
  303. RewriteRule ^.*$ - [NC,L]
  304. RewriteRule ^.*$ /index.php [NC,L]
  305. </Location>
  306. </VirtualHost>
  307. ]]></programlisting>
  308. <para>
  309. Es ist der Schrägstrich ("/") zu beachten der <filename>index.php</filename>
  310. vorangestellt ist; die Regeln für <filename>.htaccess</filename> unterscheiden
  311. sich in diesem Punkt.
  312. </para>
  313. </sect3>
  314. <sect3 id="project-structure.rewrite.apache.htaccess">
  315. <title>Rewriting innerhalb einer .htaccess Datei</title>
  316. <para>
  317. Anbei ist eine einfache <filename>.htaccess</filename> Datei welche
  318. <property>mod_rewrite</property> verwendet. Das ist Ähnlich der Konfiguration
  319. für virtuelle Hosts, ausser das Sie nur die Rewrite Regeln spezifiziert, und der
  320. führende Schrägstrich bei <filename>index.php</filename> nicht angegeben wird.
  321. </para>
  322. <programlisting language="text"><![CDATA[
  323. RewriteEngine On
  324. RewriteCond %{REQUEST_FILENAME} -s [OR]
  325. RewriteCond %{REQUEST_FILENAME} -l [OR]
  326. RewriteCond %{REQUEST_FILENAME} -d
  327. RewriteRule ^.*$ - [NC,L]
  328. RewriteRule ^.*$ index.php [NC,L]
  329. ]]></programlisting>
  330. <para>
  331. Es gibt viele Wege um <property>mod_rewrite</property> zu konfigurieren; wenn
  332. man weitere Informationen haben will, dann sollte man in Jayson Minard's
  333. <ulink url="http://devzone.zend.com/a/70">Blueprint for PHP Applications:
  334. Bootstrapping</ulink> sehen.
  335. </para>
  336. </sect3>
  337. </sect2>
  338. <sect2 id="project-structure.rewrite.iis">
  339. <title>Microsoft Internet Information Server</title>
  340. <para>
  341. Ab Version 7.0 wird <acronym>IIS</acronym> jetzt mit einer Standardmäßigen Rewrite
  342. Engine ausgeliefert. Man kann die folgende Konfiguration verwenden um die
  343. entsprechenden Rewrite Regeln zu erstellen.
  344. </para>
  345. <programlisting language="xml"><![CDATA[
  346. <?xml version="1.0" encoding="UTF-8"?>
  347. <configuration>
  348. <system.webServer>
  349. <rewrite>
  350. <rules>
  351. <rule name="Imported Rule 1" stopProcessing="true">
  352. <match url="^.*$" />
  353. <conditions logicalGrouping="MatchAny">
  354. <add input="{REQUEST_FILENAME}"
  355. matchType="IsFile" pattern=""
  356. ignoreCase="false" />
  357. <add input="{REQUEST_FILENAME}"
  358. matchType="IsDirectory"
  359. pattern=""
  360. ignoreCase="false" />
  361. </conditions>
  362. <action type="None" />
  363. </rule>
  364. <rule name="Imported Rule 2" stopProcessing="true">
  365. <match url="^.*$" />
  366. <action type="Rewrite" url="index.php" />
  367. </rule>
  368. </rules>
  369. </rewrite>
  370. </system.webServer>
  371. </configuration>
  372. ]]></programlisting>
  373. </sect2>
  374. </sect1>
  375. </appendix>