Zend_Controller-Router-Route.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.router.routes.standard">
  5. <title>Zend_Controller_Router_Route</title>
  6. <para>
  7. <classname>Zend_Controller_Router_Route</classname> ist die standardmäßige Framework Route. Sie kombiniert einfache
  8. Verwendung mit einer flexiblen Routendefinition. Jede Route besteht primär aus URL Übereinstimmungen
  9. (von statischen und dynamischen Teilen (Variablen)) und kann mit Standardwerten initialisiert werden
  10. wie auch mit variablen Notwendigkeiten.
  11. </para>
  12. <para>
  13. Angenommen unsere fiktive Anwendung benötigt eine informelle Seite über den Seitenauthor. Es soll möglich
  14. sein mit dem Browser auf <code>http://domain.com/author/martel</code> zu verweisen um die Informationen über
  15. diesen "martel" Typ zu sehen. Und die Route für so eine Funktionalität würde so aussehen:
  16. </para>
  17. <programlisting role="php"><![CDATA[
  18. $route = new Zend_Controller_Router_Route(
  19. 'author/:username',
  20. array(
  21. 'controller' => 'profile',
  22. 'action' => 'userinfo'
  23. )
  24. );
  25. $router->addRoute('user', $route);
  26. ]]>
  27. </programlisting>
  28. <para>
  29. Der ersten Parameter im Konstruktor von <code>http://domain.com/author/martel</code> ist eine
  30. Routendefinition die einer URL entspricht. Routendefinitionen bestehen aus statischen und dynamischen
  31. Teilen die durch einen Schrägstrich ('/') seperiert sind. Statische Teile sind nur einfacher Text:
  32. <code>author</code>. Dynamische Teile, Variablen genannt, werden durch einen vorangestellten
  33. Doppelpunkt, zum variablen Namen, markiert: <code>:username</code>.
  34. </para>
  35. <note>
  36. <title>Zeichen verwenden</title>
  37. <para>
  38. Die aktuelle Implementation erlaubt die Verwendung von allen Zeichen (außer einem Schrägstrich) als
  39. variablen Identifikator, aber es wird dringend empfohlen das nur Zeichen verwendet werden die auch für
  40. PHP Veriablen Identifikatoren gültig sind. Zukünftige Implementationen können dieses Verhlaten ändern,
  41. was zu versteckten Bugs im eigenen Code führen würde.
  42. </para>
  43. </note>
  44. <para>
  45. Diese Beispielroute wird verglichen wenn der Browser auf <code>http://domain.com/author/martel</code>
  46. zeigt. In diesem Fall werden alle seine Variablen dem <classname>Zend_Controller_Request</classname> Objekt
  47. injiziiert und es kann im <code>ProfileController</code> darauf zugegriffen werden. Variablen die von diesem
  48. Beispiel zurückgegeben werden können als Array mit den folgenden Schlüssel- und Wertepaaren repräsentiert
  49. werden:
  50. </para>
  51. <programlisting role="php"><![CDATA[
  52. $values = array(
  53. 'username' => 'martel',
  54. 'controller' => 'profile',
  55. 'action' => 'userinfo'
  56. );
  57. ]]>
  58. </programlisting>
  59. <para>
  60. Später sollte <classname>Zend_Controller_Dispatcher_Standard</classname> die <code>userinfoAction()</code> Methode
  61. der eigenen <code>ProfileController</code> Klasse aufrufen (im Standardmodul) basierend auf diesen
  62. Werten. Dort ist es möglich alle Variablen durch die <classname>Zend_Controller_Action::_getParam()</classname>
  63. oder <classname>Zend_Controller_Request::getParam()</classname> Methoden zuzugreifen:
  64. </para>
  65. <programlisting role="php"><![CDATA[
  66. public function userinfoAction()
  67. {
  68. $request = $this->getRequest();
  69. $username = $request->getParam('username');
  70. $username = $this->_getParam('username');
  71. }
  72. ]]>
  73. </programlisting>
  74. <para>
  75. Eine Routendefinition kann ein weiteres spezielles Zeichen enthalten - eine Wildcard - dargestellt durch ein
  76. '*' Symbol. Es wird verwendet um Parameter genauso wie im standard Modulrouter zu erhalten (var => Wertepaare
  77. definiert in der URI). Die folgende Route imitiert mehr oder weniger das Verhalten des Modulrouters:
  78. </para>
  79. <programlisting role="php"><![CDATA[
  80. $route = new Zend_Controller_Router_Route(
  81. ':module/:controller/:action/*',
  82. array('module' => 'default')
  83. );
  84. $router->addRoute('default', $route);
  85. ]]>
  86. </programlisting>
  87. <sect4 id="zend.controller.router.routes.standard.variable-defaults">
  88. <title>Variable Standards</title>
  89. <para>
  90. Jede Variable im Router kann einen Standardwert haben und das ist für was der zweite Parameter des
  91. Konstruktors von <classname>Zend_Controller_Router_Route</classname> verwendet wird. Dieser Parameter ist ein
  92. Array mit Schlüsseln die Variablennamen repräsentieren und mit Werten als gewünschte Standards:
  93. </para>
  94. <programlisting role="php"><![CDATA[
  95. $route = new Zend_Controller_Router_Route(
  96. 'archive/:year',
  97. array('year' => 2006)
  98. );
  99. $router->addRoute('archive', $route);
  100. ]]>
  101. </programlisting>
  102. <para>
  103. Die obige Route entspricht URLs wie <code>http://domain.com/archive/2005</code> und
  104. <code>http://example.com/archive</code>. Im späteren Fall wird die Variable year einen initialen
  105. Standardwert von 2006 haben.
  106. </para>
  107. <para>
  108. Dieses Beispiel resultiert darin das eine year Variable in das Anfrage Objekt injiziiert wird. Da keine
  109. Routinginformation vorhanden ist (es sind keine Kontroller und Aktionsparameter definiert), wird die
  110. Anwendung zum Standardkontroller und der Aktionsmethode (welche beide in
  111. <classname>Zend_Controller_Dispatcher_Abstract</classname> definiert sind) weitergeleitet. Um es verwendbarer
  112. zu machen muß ein gültiger Kontroller und eine gültige aktion als Standard für die Route angegeben
  113. werden:
  114. </para>
  115. <programlisting role="php"><![CDATA[
  116. $route = new Zend_Controller_Router_Route(
  117. 'archive/:year',
  118. array(
  119. 'year' => 2006,
  120. 'controller' => 'archive',
  121. 'action' => 'show'
  122. )
  123. );
  124. $router->addRoute('archive', $route);
  125. ]]>
  126. </programlisting>
  127. <para>
  128. Diese Route führt dazu das an die Methode <code>showAction()</code> der Klasse
  129. <code>ArchiveController</code> weitergeleitet wird.
  130. </para>
  131. </sect4>
  132. <sect4 id="zend.controller.router.routes.standard.variable-requirements">
  133. <title>Variable Anforderungen</title>
  134. <para>
  135. Man kann einen dritten Parameter dem <classname>Zend_Controller_Router_Route</classname> Konstruktor hinzufügen
  136. wo variable Anforderungen gesetzt werden können. Diese werden als Teil eines regulären Ausdrucks
  137. definiert:
  138. </para>
  139. <programlisting role="php"><![CDATA[
  140. $route = new Zend_Controller_Router_Route(
  141. 'archive/:year',
  142. array(
  143. 'year' => 2006,
  144. 'controller' => 'archive',
  145. 'action' => 'show'
  146. ),
  147. array('year' => '\d+')
  148. );
  149. $router->addRoute('archive', $route);
  150. ]]>
  151. </programlisting>
  152. <para>
  153. Mit einer Route die wie oben definiert ist, wird das Routing nur dann stattfinden wenn die year
  154. Variable nummerische Daten enthält, z.B. <code>http://domain.com/archive/2345</code>.
  155. Eine URL wie <code>http://example.com/archive/test</code> wird nicht zugeordnet und die Kontrolle wird
  156. stattdessen an die nächste Route in der Kette übertragen.
  157. </para>
  158. </sect4>
  159. <sect4 id="zend.controller.router.routes.standard.translated-segments">
  160. <title>Übersetzte Segmente</title>
  161. <para>
  162. Die Standardroute unterstützt übersetzte Segmente. Um dieses Feature zu verwenden muß zumindest
  163. ein Übersetzer (eine Instanz von <classname>Zend_Translate</classname>) auf einem der folgenden Wege
  164. definiert werden:
  165. </para>
  166. <itemizedlist>
  167. <listitem>
  168. <para>
  169. In die Registry mit dem Schlüssel <classname>Zend_Translate</classname> geben.
  170. </para>
  171. </listitem>
  172. <listitem>
  173. <para>
  174. Über die statische Methode
  175. <classname>Zend_Controller_Router_Route::setDefaultTranslator()</classname> setzen.
  176. </para>
  177. </listitem>
  178. <listitem>
  179. <para>
  180. Als vierten Parameter im Constructor übergeben.
  181. </para>
  182. </listitem>
  183. </itemizedlist>
  184. <para>
  185. Standardmäßig wird das Gebietsschema verwendet das in der Instanz von <classname>Zend_Translate</classname>
  186. verwendet wird. Um es zu überschreiben, kann es (als Instanz von <classname>Zend_Locale</classname> oder
  187. einem Gebietsschema-String) auf einem der folgenden Wege gesetzt werden:
  188. </para>
  189. <itemizedlist>
  190. <listitem>
  191. <para>
  192. In die Registry mit dem Schlüssel <classname>Zend_Locale</classname> geben.
  193. </para>
  194. </listitem>
  195. <listitem>
  196. <para>
  197. Über die statische Methode
  198. <classname>Zend_Controller_Router_Route::setDefaultLocale()</classname> setzen.
  199. </para>
  200. </listitem>
  201. <listitem>
  202. <para>
  203. Als fünften Parameter im Constructor übergeben.
  204. </para>
  205. </listitem>
  206. <listitem>
  207. <para>
  208. Als <code>@locale</code> Parameter der assemble Methode übergeben.
  209. </para>
  210. </listitem>
  211. </itemizedlist>
  212. <para>
  213. Übersetzte Segmente werden in zwei Teile getrennt. Ein fixes Segment dem ein einzelnes
  214. <code>@</code>-Zeichen vorangestellt wird, der anhand des aktuellen Gebietsschemas übersetzt wird
  215. und auf der Position des Parameters eingefügt wird. Dynamischen Segmenten wird ein
  216. <code>:@</code> vorangestellt. Beim Zusammenbauen, wird der gegebene Parameter übersetzt und an der
  217. Position des Parameters eingefügt. Bei der Überprüfung, wird der übersetzte Parameter von der
  218. URL wieder in die Nachrichten ID umgewandelt.
  219. </para>
  220. <note>
  221. <title>Nachrichten IDs und eigene Sprachdateien</title>
  222. <para>
  223. Normalerweise werden Nachrichten IDs die man in einer seiner Routen verwenden will, bereits in
  224. einem View Skript oder irgendwo anders verwendet. Um die komplette Kontrolle über sichere
  225. URLs zu haben, sollte man eine eigene Sprachdatei für die Nachrichten haben die in einer
  226. Route verwendet werden.
  227. </para>
  228. </note>
  229. <para>
  230. Nachfolgend ist die einfachste Verwendung gezeigt um eine Standardroute für übersetzte Segmente
  231. zu Verwenden:
  232. </para>
  233. <programlisting role="php"><![CDATA[
  234. // Den Übersetzer vorbereiten
  235. $translator = new Zend_Translate('array', array(), 'en');
  236. $translator->addTranslation(array('archive' => 'archiv',
  237. 'year' => 'jahr',
  238. 'month' => 'monat',
  239. 'index' => 'uebersicht'),
  240. 'de');
  241. // Das aktuelle Gebietsschema für den Übersetzer setzen
  242. $translator->setLocale('en');
  243. // Als Standard-Übersetzer für Routen setzen
  244. Zend_Controller_Router_Route::setDefaultTranslator($translator);
  245. ]]>
  246. </programlisting>
  247. <para>
  248. Dieses Beispiel zeigt die Verwendung von statischen Segmenten:
  249. </para>
  250. <programlisting role="php"><![CDATA[
  251. // Die Route erstellen
  252. $route = new Zend_Controller_Router_Route(
  253. '@archive',
  254. array(
  255. 'controller' => 'archive',
  256. 'action' => 'index'
  257. )
  258. );
  259. $router->addRoute('archive', $route);
  260. // Die URL im Standard-Gebietsschema zusammenbauen: archive
  261. $route->assemble(array());
  262. // Die URL in Deutsch zusammenbauen: archiv
  263. $route->assemble(array());
  264. ]]>
  265. </programlisting>
  266. <para>
  267. Man kann dynamische Segmente verwenden um eine Modul-Route, so wie die übersetzte Version,
  268. zu erstellen:
  269. </para>
  270. <programlisting role="php"><![CDATA[
  271. // Die Route erstellen
  272. $route = new Zend_Controller_Router_Route(
  273. ':@controller/:@action/*',
  274. array(
  275. 'controller' => 'index',
  276. 'action' => 'index'
  277. )
  278. );
  279. $router->addRoute('archive', $route);
  280. // Die URL im Standard-Gebietsschema zusammenbauen: archive/index/foo/bar
  281. $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
  282. // Die URL in Deutsch zusammenbauen: archiv/uebersicht/foo/bar
  283. $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
  284. ]]>
  285. </programlisting>
  286. <para>
  287. Man kann auch statische und dynamische Segmente mischen:
  288. </para>
  289. <programlisting role="php"><![CDATA[
  290. // Die Route erstellen
  291. +$route = new Zend_Controller_Router_Route(
  292. '@archive/:@mode/:value',
  293. array(
  294. 'mode' => 'year'
  295. 'value' => 2005,
  296. 'controller' => 'archive',
  297. 'action' => 'show'
  298. ),
  299. array('mode' => '(month|year)'
  300. 'value' => '\d+')
  301. );
  302. $router->addRoute('archive', $route);
  303. // Die URL im Standard-Gebietsschema zusammenbauen: archive/month/5
  304. $route->assemble(array('mode' => 'month', 'value' => '5'));
  305. // Die URL in Deutsch zusammenbauen: archiv/monat/5
  306. $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));
  307. ]]>
  308. </programlisting>
  309. </sect4>
  310. </sect3>
  311. <!--
  312. vim:se ts=4 sw=4 et:
  313. -->