File: project-structure.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (415 lines) | stat: -rw-r--r-- 18,820 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
<?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>