| 12
 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
 
 | <?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.controller.modular">
    <title>Eine konventionelle modulare Verzeichnis Struktur verwenden</title>
    <sect2 id="zend.controller.modular.introduction">
        <title>Einführung</title>
        <para>
            Eine konventionelle modulare Verzeichnisstruktur erlaubt es verschiedene
            <acronym>MVC</acronym> Anwendungen in selbst-enthaltene Einheiten zu teilen, und diese
            mit verschiedenen Front Controllern wiederzuverwenden. Um so eine Verzeichnisstruktur
            zu zeigen:
        </para>
        <programlisting language="txt"><![CDATA[
docroot/
    index.php
application/
    default/
        controllers/
            IndexController.php
            FooController.php
        models/
        views/
            scripts/
                index/
                foo/
            helpers/
            filters/
    blog/
        controllers/
            IndexController.php
        models/
        views/
            scripts/
                index/
            helpers/
            filters/
    news/
        controllers/
            IndexController.php
            ListController.php
        models/
        views/
            scripts/
                index/
                list/
            helpers/
            filters/
]]></programlisting>
        <para>
            In diesem Paradigma arbeitet der Modulname als Prefix für den Controller den er enthält.
            Das obige Beispiel enthält drei Modul Controller,
            '<classname>Blog_IndexController</classname>',
            '<classname>News_IndexController</classname>', und
            '<classname>News_ListController</classname>'. Zwei gloale Controller,
            '<classname>IndexController</classname>' und '<classname>FooController</classname>'
            werden auch definiert; keiner von diesen ist in einem Namensraum. Diese
            Verzeichnisstruktur wird für die Beispiele in diesem Kapitel verwendet.
        </para>
        <note>
            <title>Keine Verwendung von Namensräumen im Standard Modul</title>
            <para>
                Es ist zu beachten das Controller, im Standardmodul, keinen Prefix für den
                Namensraum benötigen. Deshalb benötigt der Controller, im obigen Beispiel, den
                Prefix 'Default_' nicht -- sie werden einfach dispatched gemäß dem Namen des Basis
                Controllers: '<classname>IndexController</classname>' und
                '<classname>FooController</classname>'. Ein Prefix für den Namensraum
                wird trotzdem in allen anderen Modulen verwendet.
            </para>
        </note>
        <para>
            Also, wie kann solch ein Verzeichnislayout mit den <acronym>MVC</acronym> Komponenten
            des Zend Frameworks implementiert werden?
        </para>
    </sect2>
    <sect2 id="zend.controller.modular.directories">
        <title>Verzeichnisse für Modul Controller spezifizieren</title>
        <para>
            Der erste Schritt um Module zu verwenden ist es, die Art der Spezifizierung der
            Controller Verzeichnis Liste im Front Controller, zu Ändern. In der grundsätzlichen
            <acronym>MVC</acronym> Serie, kann entweder ein Array oder ein String an
            <methodname>setControllerDirectory()</methodname>, oder ein Pfad an
            <methodname>addControllerDirectory()</methodname> übergeben werden. Wenn Module
            verwendet werden, müssen die Aufrufe dieser Methoden leicht geändert werden.
        </para>
        <para>
            Mit <methodname>setControllerDirectory()</methodname>, muß ein assoziatives Array
            übergeben und Schlüssel und Werte Paare von Modul Namen und Verzeichnis Pfaden
            übergeben werden. Der spezielle Schlüssel <property>default</property> wird für globale
            Controller verwenden (diejenigen die keinen Modul Namensraum benötigen). Alle Einträge
            sollten einen String Schlüssel enthalten der zu einem einzelnen Pfad zeigt, und der
            <property>default</property> Schlüssel muß vorhanden sein. Als Beispiel:
        </para>
        <programlisting language="php"><![CDATA[
$front->setControllerDirectory(array(
    'default' => '/path/to/application/controllers',
    'blog'    => '/path/to/application/blog/controllers'
));
]]></programlisting>
        <para>
            <methodname>addControllerDirectory()</methodname> nimmt ein optionales zweites
            Argument. Wenn Module verwendet werden, kann der Modulname als zweites Argument
            übergeben werden; wenn nicht spezifiziert, wird der Pfad zum
            <emphasis>default</emphasis> Namensraum hinzugefügt. Als Beispiel:
        </para>
        <programlisting language="php"><![CDATA[
$front->addControllerDirectory('/path/to/application/news/controllers',
                               'news');
]]></programlisting>
        <para>
            Und das beste zum Schluß. Der einfachste Weg um Modul Verzeichnisse zu spezifizieren
            ist es en masse zu machen, mit allen Modulen in einem gemeinsamen Verzeichnis und die
            gleiche Struktur verwendend. Das kann mit <methodname>addModuleDirectory()</methodname>
            getan werden:
        </para>
        <programlisting language="php"><![CDATA[
/**
 * Nehmen wir die folgende Verzeichnisstruktur an:
 * application/
 *     modules/
 *         default/
 *             controllers/
 *         foo/
 *             controllers/
 *         bar/
 *             controllers/
 */
$front->addModuleDirectory('/path/to/application/modules');
]]></programlisting>
        <para>
            Das obige Beispiel definiert die <emphasis>default</emphasis>,
            <emphasis>foo</emphasis>, und <emphasis>bar</emphasis> Module, die alle zum
            Unterverzeichnis <filename>controllers/</filename> zeigen und zu Ihrem betreffenden
            Modul.
        </para>
        <para>
            Das Unterverzeichnis für den Controller kann angepasst werden um diesen in eigenen
            Modulen mit <methodname>setModuleControllerDirectoryName()</methodname> verwenden:
        </para>
        <programlisting language="php"><![CDATA[
/**
 * Das Controller Unterverzeichnis ändern damit es 'con' ist
 * application/
 *     modules/
 *         default/
 *             con/
 *         foo/
 *             con/
 *         bar/
 *             con/
 */
$front->setModuleControllerDirectoryName('con');
$front->addModuleDirectory('/path/to/application/modules');
]]></programlisting>
        <note>
            <para>
                Man kann angeben das kein Controller Unterverzeichnis für die eigenen Module
                verwendet wird, indem ein leerer Wert an
                <methodname>setModuleControllerDirectoryName()</methodname> übergeben wird.
            </para>
        </note>
    </sect2>
    <sect2 id="zend.controller.modular.router">
        <title>Zu Modulen routen</title>
        <para>
            Die Standardroute in <classname>Zend_Controller_Router_Rewrite</classname> ist ein
            Objekt vom Typ <classname>Zend_Controller_Router_Route_Module</classname>. Diese Route
            erwartet eines der folgenden Routing Schemas:
        </para>
        <itemizedlist>
            <listitem><para><filename>:module/:controller/:action/*</filename></para></listitem>
            <listitem><para><filename>:controller/:action/*</filename></para></listitem>
        </itemizedlist>
        <para>
            In anderen Worten, wird jeder Controller und jede Aktion durch sich selbst entsprechen
            oder mit einem vorangestellten Modul. Diese Regeln für die Entsprechung spezifizieren,
            das ein Modul nur dann entspricht, wenn ein Schlüssel mit dem gleichen Namen im
            Controller Verzeichnis Array existiert, das dem Front Controller und Dispatcher
            übergeben wird.
        </para>
    </sect2>
    <sect2 id="zend.controller.modular.defaultcontroller">
        <title>Modul oder globaler Standard Controller</title>
        <para>
            Im Standardrouter wird der StandardController verwendet
            (<classname>IndexController</classname>, solange nicht anders angefragt), wenn kein
            Controller in der <acronym>URL</acronym> spezifiziert wurde. Bei modularen Controllern
            wird der Dispatcher zuerst für diesen Standardcontroller im Modulpfad nachsehen, wenn
            ein Modul aber kein Controller spezifiziert wurde, und fällt dann auf den
            Standardcontroller zurück, der im globalen 'default' Namensraum gefunden wird.
        </para>
        <para>
            Wenn immer auf den globalen Namensraum zurückgefallen werden soll, muß der
            <varname>$useDefaultControllerAlways</varname> im Front Controller gesetzt werden:
        </para>
        <programlisting language="php"><![CDATA[
$front->setParam('useDefaultControllerAlways', true);
]]></programlisting>
    </sect2>
</sect1>
 |