File: Zend_Controller-Router-Route.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 (383 lines) | stat: -rw-r--r-- 14,309 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
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect3 id="zend.controller.router.routes.standard">
    <title>Zend_Controller_Router_Route</title>

    <para>
        <classname>Zend_Controller_Router_Route</classname> ist die standardmäßige Framework Route.
        Sie kombiniert einfache Verwendung mit einer flexiblen Routendefinition. Jede Route besteht
        primär aus <acronym>URL</acronym> Übereinstimmungen (von statischen und dynamischen Teilen
        (Variablen)) und kann mit Standardwerten initialisiert werden wie auch mit variablen
        Notwendigkeiten.
    </para>

    <para>
        Angenommen unsere fiktive Anwendung benötigt eine informelle Seite über den Seitenauthor. Es
        soll möglich sein mit dem Browser auf <filename>http://domain.com/author/martel</filename>
        zu verweisen um die Informationen über diesen "martel" Typ zu sehen. Und die Route für so
        eine Funktionalität würde so aussehen:
    </para>

    <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    'author/:username',
    array(
        'controller' => 'profile',
        'action'     => 'userinfo'
    )
);

$router->addRoute('user', $route);
]]></programlisting>

    <para>
        Der ersten Parameter im Konstruktor von
        <classname>Zend_Controller_Router_Route</classname> ist eine Routendefinition die einer
        <acronym>URL</acronym> entspricht. Routendefinitionen bestehen aus statischen und
        dynamischen Teilen die durch einen Schrägstrich ('/') seperiert sind. Statische Teile sind
        nur einfacher Text: <command>author</command>. Dynamische Teile, Variablen genannt, werden
        durch einen vorangestellten Doppelpunkt, zum variablen Namen, markiert:
        <command>:username</command>.
    </para>

    <note>
        <title>Zeichen verwenden</title>

        <para>
            Die aktuelle Implementation erlaubt die Verwendung von allen Zeichen (außer einem
            Schrägstrich) als variablen Identifikator, aber es wird dringend empfohlen das nur
            Zeichen verwendet werden die auch für <acronym>PHP</acronym> Veriablen Identifikatoren
            gültig sind. Zukünftige Implementationen können dieses Verhlaten ändern, was zu
            versteckten Bugs im eigenen Code führen würde.
        </para>
    </note>

    <para>
        Diese Beispielroute wird verglichen wenn der Browser auf
        <filename>http://domain.com/author/martel</filename> zeigt. In diesem Fall werden alle seine
        Variablen dem <classname>Zend_Controller_Request</classname> Objekt injiziiert und es kann
        im <classname>ProfileController</classname> darauf zugegriffen werden. Variablen die von
        diesem Beispiel zurückgegeben werden können als Array mit den folgenden Schlüssel- und
        Wertepaaren repräsentiert werden:
    </para>

    <programlisting language="php"><![CDATA[
$values = array(
    'username'   => 'martel',
    'controller' => 'profile',
    'action'     => 'userinfo'
);
]]></programlisting>

    <para>
        Später sollte <classname>Zend_Controller_Dispatcher_Standard</classname> die
        <methodname>userinfoAction()</methodname> Methode der eigenen
        <classname>ProfileController</classname> Klasse aufrufen (im Standardmodul) basierend auf
        diesen Werten. Dort ist es möglich alle Variablen durch die
        <methodname>Zend_Controller_Action::_getParam()</methodname> oder
        <methodname>Zend_Controller_Request::getParam()</methodname> Methoden zuzugreifen:
    </para>

    <programlisting language="php"><![CDATA[
public function userinfoAction()
{
    $request = $this->getRequest();
    $username = $request->getParam('username');

    $username = $this->_getParam('username');
}
]]></programlisting>

    <para>
        Eine Routendefinition kann ein weiteres spezielles Zeichen enthalten - eine Wildcard -
        dargestellt durch ein '*' Symbol. Es wird verwendet um Parameter genauso wie im standard
        Modulrouter zu erhalten (var => Wertepaare definiert in der <acronym>URI</acronym>). Die
        folgende Route imitiert mehr oder weniger das Verhalten des Modulrouters:
    </para>

    <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    ':module/:controller/:action/*',
    array('module' => 'default')
);
$router->addRoute('default', $route);
]]></programlisting>

    <sect4 id="zend.controller.router.routes.standard.variable-defaults">
        <title>Variable Standards</title>

        <para>
            Jede Variable im Router kann einen Standardwert haben und das ist für was der zweite
            Parameter des Konstruktors von <classname>Zend_Controller_Router_Route</classname>
            verwendet wird. Dieser Parameter ist ein Array mit Schlüsseln die Variablennamen
            repräsentieren und mit Werten als gewünschte Standards:
        </para>

        <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    'archive/:year',
    array('year' => 2006)
);
$router->addRoute('archive', $route);
]]></programlisting>

        <para>
            Die obige Route entspricht <acronym>URL</acronym>s wie
            <filename>http://domain.com/archive/2005</filename> und
            <filename>http://example.com/archive</filename>. Im späteren Fall wird die Variable year
            einen initialen Standardwert von 2006 haben.
        </para>

        <para>
            Dieses Beispiel resultiert darin das eine year Variable in das Anfrage Objekt injiziiert
            wird. Da keine Routinginformation vorhanden ist (es sind keine Controller und
            Aktionsparameter definiert), wird die Anwendung zum Standardcontroller und der
            Aktionsmethode (welche beide in
            <classname>Zend_Controller_Dispatcher_Abstract</classname> definiert sind)
            weitergeleitet. Um es verwendbarer zu machen muß ein gültiger Controller und eine
            gültige aktion als Standard für die Route angegeben werden:
        </para>

        <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    'archive/:year',
    array(
        'year'       => 2006,
        'controller' => 'archive',
        'action'     => 'show'
    )
);
$router->addRoute('archive', $route);
]]></programlisting>

        <para>
            Diese Route führt dazu das an die Methode <methodname>showAction()</methodname> der
            Klasse <classname>ArchiveController</classname> weitergeleitet wird.
        </para>
    </sect4>

    <sect4 id="zend.controller.router.routes.standard.variable-requirements">
        <title>Variable Anforderungen</title>

        <para>
            Man kann einen dritten Parameter dem <classname>Zend_Controller_Router_Route</classname>
            Konstruktor hinzufügen wo variable Anforderungen gesetzt werden können. Diese werden als
            Teil eines regulären Ausdrucks definiert:
        </para>

        <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    'archive/:year',
    array(
        'year'       => 2006,
        'controller' => 'archive',
        'action'     => 'show'
    ),
    array('year' => '\d+')
);
$router->addRoute('archive', $route);
]]></programlisting>

        <para>
            Mit einer Route die wie oben definiert ist, wird das Routing nur dann stattfinden wenn
            die year Variable nummerische Daten enthält, z.B.
            <filename>http://domain.com/archive/2345</filename>. Eine <acronym>URL</acronym> wie
            <filename>http://example.com/archive/test</filename> wird nicht zugeordnet und die
            Kontrolle wird stattdessen an die nächste Route in der Kette übertragen.
        </para>
    </sect4>

    <sect4 id="zend.controller.router.routes.standard.translated-segments">
        <title>Übersetzte Segmente</title>

        <para>
            Die Standardroute unterstützt übersetzte Segmente. Um dieses Feature zu verwenden muß
            zumindest ein Übersetzer (eine Instanz von <classname>Zend_Translate</classname>) auf
            einem der folgenden Wege definiert werden:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    In die Registry mit dem Schlüssel <classname>Zend_Translate</classname> geben.
                </para>
            </listitem>

            <listitem>
                <para>
                    Über die statische Methode
                    <methodname>Zend_Controller_Router_Route::setDefaultTranslator()</methodname>
                    setzen.
                </para>
            </listitem>

            <listitem>
                <para>
                    Als vierten Parameter im Constructor übergeben.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Standardmäßig wird das Gebietsschema verwendet das in der Instanz von
            <classname>Zend_Translate</classname> verwendet wird. Um es zu überschreiben, kann es
            (als Instanz von <classname>Zend_Locale</classname> oder einem Gebietsschema-String) auf
            einem der folgenden Wege gesetzt werden:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    In die Registry mit dem Schlüssel <classname>Zend_Locale</classname> geben.
                </para>
            </listitem>

            <listitem>
                <para>
                    Über die statische Methode
                    <methodname>Zend_Controller_Router_Route::setDefaultLocale()</methodname>
                    setzen.
                </para>
            </listitem>

            <listitem>
                <para>
                    Als fünften Parameter im Constructor übergeben.
                </para>
            </listitem>

            <listitem>
                <para>
                    Als <command>@locale</command> Parameter der assemble Methode übergeben.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Übersetzte Segmente werden in zwei Teile getrennt. Ein fixes Segment dem ein einzelnes
            <emphasis>@</emphasis>-Zeichen vorangestellt wird, der anhand des aktuellen
            Gebietsschemas übersetzt wird und auf der Position des Parameters eingefügt wird.
            Dynamischen Segmenten wird ein <command>:@</command> vorangestellt. Beim Zusammenbauen,
            wird der gegebene Parameter übersetzt und an der Position des Parameters eingefügt. Bei
            der Überprüfung, wird der übersetzte Parameter von der <acronym>URL</acronym> wieder in
            die Nachrichten ID umgewandelt.
        </para>

        <note>
            <title>Nachrichten IDs und eigene Sprachdateien</title>

            <para>
                Normalerweise werden Nachrichten IDs die man in einer seiner Routen verwenden will,
                bereits in einem View Skript oder irgendwo anders verwendet. Um die komplette
                Kontrolle über sichere <acronym>URL</acronym>s zu haben, sollte man eine eigene
                Sprachdatei für die Nachrichten haben die in einer Route verwendet werden.
            </para>
        </note>

        <para>
            Nachfolgend ist die einfachste Verwendung gezeigt um eine Standardroute für übersetzte
            Segmente zu Verwenden:
        </para>

        <programlisting language="php"><![CDATA[
// Den Übersetzer vorbereiten
$translator = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array(),
        'locale'  => 'en'
    )
);
$translator->addTranslation(
    array(
        'content' =>
            array(
                'archive' => 'archiv',
                'year'    => 'jahr',
                'month'   => 'monat',
                'index'   => 'uebersicht'
            ),
        'locale' => 'de'
    )
);

// Das aktuelle Gebietsschema für den Übersetzer setzen
$translator->setLocale('en');

// Als Standard-Übersetzer für Routen setzen
Zend_Controller_Router_Route::setDefaultTranslator($translator);
]]></programlisting>

        <para>
            Dieses Beispiel zeigt die Verwendung von statischen Segmenten:
        </para>

        <programlisting language="php"><![CDATA[
// Die Route erstellen
$route = new Zend_Controller_Router_Route(
    '@archive',
    array(
        'controller' => 'archive',
        'action'     => 'index'
    )
);
$router->addRoute('archive', $route);

// Die URL im Standard-Gebietsschema zusammenbauen: archive
$route->assemble(array());

// Die URL in Deutsch zusammenbauen: archiv
$route->assemble(array());
]]></programlisting>

        <para>
            Man kann dynamische Segmente verwenden um eine Modul-Route, so wie die übersetzte
            Version, zu erstellen:
        </para>

        <programlisting language="php"><![CDATA[
// Die Route erstellen
$route = new Zend_Controller_Router_Route(
    ':@controller/:@action/*',
    array(
        'controller' => 'index',
        'action'     => 'index'
    )
);
$router->addRoute('archive', $route);

// Die URL im Standard-Gebietsschema zusammenbauen: archive/index/foo/bar
$route->assemble(array('controller' => 'archive', 'foo' => 'bar'));

// Die URL in Deutsch zusammenbauen: archiv/uebersicht/foo/bar
$route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
]]></programlisting>

        <para>
            Man kann auch statische und dynamische Segmente mischen:
        </para>

        <programlisting language="php"><![CDATA[
// Die Route erstellen
+$route = new Zend_Controller_Router_Route(
    '@archive/:@mode/:value',
    array(
        'mode'       => 'year'
        'value'      => 2005,
        'controller' => 'archive',
        'action'     => 'show'
    ),
    array('mode'  => '(month|year)'
          'value' => '\d+')
);
$router->addRoute('archive', $route);

// Die URL im Standard-Gebietsschema zusammenbauen: archive/month/5
$route->assemble(array('mode' => 'month', 'value' => '5'));

// Die URL in Deutsch zusammenbauen: archiv/monat/5
$route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));
]]></programlisting>
    </sect4>
</sect3>