Zend_Controller-Router-Route.xml 14 KB

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