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>
|