Zend_Controller-Router-Route.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  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> est la route par défaut intégrée
  8. dans le routeur de réécriture (RewriteRouter). Ce routeur combine les deux avantages que
  9. sont la simplicité d'utilisation et la flexibilité. Chaque route est définie par une
  10. correspondance d'<acronym>URL</acronym>, statique ou dynamique, et des valeurs par défaut
  11. peuvent être fournies, de même que des valeurs obligatoires.
  12. </para>
  13. <para>
  14. Imaginons une application ayant besoin de posséder une page en décrivant l'auteur.
  15. Nous voulons que lorsque le navigateur pointe vers
  16. <filename>http://domaine.fr/auteur/martel</filename>, la page d'informations en question
  17. puisse apparaître, au sujet de "martel". La route pour une telle <acronym>URL</acronym>
  18. pourrait être&#160;:
  19. </para>
  20. <programlisting language="php"><![CDATA[
  21. $route = new Zend_Controller_Router_Route(
  22. 'auteur/:username',
  23. array(
  24. 'controller' => 'profile',
  25. 'action' => 'userinfo'
  26. )
  27. );
  28. $router->addRoute('user', $route);
  29. ]]></programlisting>
  30. <para>
  31. Le premier paramètre du constructeur de <classname>Zend_Controller_Router_Route</classname>
  32. est la définition de la route à analyser avec l'<acronym>URL</acronym>. Les définitions
  33. des routes sont des parties statiques et dynamiques, séparées par des slashs ("/").
  34. Les parties statiques sont juste du texte brut&#160;: <emphasis>auteur</emphasis>. Les
  35. dynamiques, appelées variables, sont repérées grâce à un caractère
  36. deux-points (:) devant la variable&#160;: <emphasis>:username</emphasis>.
  37. </para>
  38. <note>
  39. <title>Utilisation des caractères</title>
  40. <para>
  41. Pour identifier une variable dans un schéma de routage (après le deux-points), en
  42. théorie n'importe quel caractère fait l'affaire (sauf le slash "/"). Cependant il est
  43. conseillé de n'utiliser que des caractères que <acronym>PHP</acronym> comprend comme
  44. étant des noms de variables valides. Les implémentations futures de ce comportement
  45. peuvent changer, altérant ainsi votre code.
  46. </para>
  47. </note>
  48. <para>
  49. Cette route exemple devrait être utilisée lorsque le navigateur pointe vers
  50. <filename>http://domaine.fr/auteur/martel</filename>, et dans un tel cas, tous les
  51. paramètres de la requête seront injectés dans l'objet
  52. <classname>Zend_Controller_Request</classname> et
  53. seront accessibles à travers votre <classname>ProfileController</classname>. Les variables
  54. retournées par cet exemple peuvent être représentées par le tableau suivant&#160;:
  55. </para>
  56. <programlisting language="php"><![CDATA[
  57. $values = array(
  58. 'username' => 'martel',
  59. 'controller' => 'profile',
  60. 'action' => 'userinfo'
  61. );
  62. ]]></programlisting>
  63. <para>
  64. Plus tard, <classname>Zend_Controller_Dispatcher_Standard</classname> va distribuer
  65. vers la méthode <methodname>userinfoAction()</methodname> de
  66. <classname>ProfileController</classname> (dans le module par défaut) selon ces valeurs.
  67. A cet endroit, il sera possible d'accéder à toutes les variables de la requête grâce à
  68. <methodname>Zend_Controller_Action::_getParam()</methodname> ou
  69. <methodname>Zend_Controller_Request::getParam()</methodname>&#160;:
  70. </para>
  71. <programlisting language="php"><![CDATA[
  72. public function userinfoAction()
  73. {
  74. $request = $this->getRequest();
  75. $username = $request->getParam('username');
  76. $username = $this->_getParam('username');
  77. }
  78. ]]></programlisting>
  79. <para>
  80. La définition des routes peut contenir un ou plusieurs caractères spéciaux - des
  81. jokers - représentés par le symbole '*'. Il est utilisé pour collecter des paramètres.
  82. L'exemple suivant représente plus ou moins le comportement par défaut de la route
  83. "Module"&#160;:
  84. </para>
  85. <programlisting language="php"><![CDATA[
  86. $route = new Zend_Controller_Router_Route(
  87. ':module/:controller/:action/*',
  88. array('module' => 'default')
  89. );
  90. $router->addRoute('default', $route);
  91. ]]></programlisting>
  92. <sect4 id="zend.controller.router.routes.standard.variable-defaults">
  93. <title>Variables par défaut</title>
  94. <para>
  95. Chaque variable dynamique dans la définition des routes peut avoir une valeur par
  96. défaut. C'est à cela que sert le second paramètre du constructeur de
  97. <classname>Zend_Controller_Router_Route</classname>. Il s'agit d'un tableau avec comme
  98. clés les noms des variables, et comme valeurs, leurs valeurs par défaut&#160;:
  99. </para>
  100. <programlisting language="php"><![CDATA[
  101. $route = new Zend_Controller_Router_Route(
  102. 'archive/:annee',
  103. array('annee' => 2006)
  104. );
  105. $router->addRoute('archive', $route);
  106. ]]></programlisting>
  107. <para>
  108. L'exemple ci-dessus établira une correspondance avec les <acronym>URL</acronym> comme
  109. <filename>http://domaine.fr/archive/2005</filename> et
  110. <filename>http://exemple.fr/archive</filename>. Dans ce dernier cas, la variable de
  111. l'année (<emphasis>annee</emphasis>) aura la valeur 2006.
  112. </para>
  113. <para>
  114. L'exemple ci-dessus injecte ainsi un paramètre représentant une année
  115. (<emphasis>annee</emphasis>). Si aucune information de contrôleur ou d'actions n'est
  116. présente, alors ceux par défaut seront utilisés (ils sont définis dans
  117. <classname>Zend_Controller_Dispatcher_Abstract</classname>). Pour que l'exemple soit
  118. plus intuitif, spécifions des paires contrôleur et action par défaut dans notre
  119. route&#160;:
  120. </para>
  121. <programlisting language="php"><![CDATA[
  122. $route = new Zend_Controller_Router_Route(
  123. 'archive/:annee',
  124. array(
  125. 'annee' => 2006,
  126. 'controller' => 'archive',
  127. 'action' => 'show'
  128. )
  129. );
  130. $router->addRoute('archive', $route);
  131. ]]></programlisting>
  132. <para>
  133. Cette route va alors donner une distribution vers la méthode
  134. <methodname>showAction()</methodname> de <classname>ArchiveController</classname>.
  135. </para>
  136. </sect4>
  137. <sect4 id="zend.controller.router.routes.standard.variable-requirements">
  138. <title>Obligations et contraintes des variables</title>
  139. <para>
  140. Vous pouvez ajouter un troisième paramètre au constructeur de
  141. <classname>Zend_Controller_Router_Route</classname> pour spécifier une variable
  142. obligatoire. Ceci s'effectue au moyen d'expressions régulières&#160;:
  143. </para>
  144. <programlisting language="php"><![CDATA[
  145. $route = new Zend_Controller_Router_Route(
  146. 'archive/:annee',
  147. array(
  148. 'annee' => 2006,
  149. 'controller' => 'archive',
  150. 'action' => 'show'
  151. ),
  152. array('year' => '\d+')
  153. );
  154. $router->addRoute('archive', $route);
  155. ]]></programlisting>
  156. <para>
  157. Avec une telle définition de route, comme ci-dessus, le routeur n'établira une
  158. correspondance que si la variable "<emphasis>annee</emphasis>" contient une donnée
  159. numérique&#160;: <filename>http://domaine.fr/archive/2345</filename>. Une
  160. <acronym>URL</acronym> comme <filename>http://exemple.annee/archive/test</filename>
  161. ne sera pas captée (matchée) par cette route, et le contrôle sera passé à la route
  162. suivante, etc.
  163. </para>
  164. </sect4>
  165. <sect4 id="zend.controller.router.routes.standard.translated-segments">
  166. <title>Translated segments</title>
  167. <para>
  168. The standard route supports translated segments. To use this
  169. feature, you have to define at least a translator (an instance
  170. of <classname>Zend_Translate</classname>) via one of the following ways:
  171. </para>
  172. <itemizedlist>
  173. <listitem>
  174. <para>
  175. Put it into the registry with the key <classname>Zend_Translate</classname>.
  176. </para>
  177. </listitem>
  178. <listitem>
  179. <para>
  180. Set it via the static method
  181. <methodname>Zend_Controller_Router_Route::setDefaultTranslator()</methodname>.
  182. </para>
  183. </listitem>
  184. <listitem>
  185. <para>
  186. Pass it as fourth parameter to the constructor.
  187. </para>
  188. </listitem>
  189. </itemizedlist>
  190. <para>
  191. By default, the locale specified in the <classname>Zend_Translate</classname>
  192. instance will be used. To override it, you set it
  193. (an instance of <classname>Zend_Locale</classname> or a locale string) in one
  194. of the following ways:
  195. </para>
  196. <itemizedlist>
  197. <listitem>
  198. <para>
  199. Put it into the registry with the key <classname>Zend_Locale</classname>.
  200. </para>
  201. </listitem>
  202. <listitem>
  203. <para>
  204. Set it via the static method
  205. <methodname>Zend_Controller_Router_Route::setDefaultLocale()</methodname>.
  206. </para>
  207. </listitem>
  208. <listitem>
  209. <para>
  210. Pass it as fifth parameter to the constructor.
  211. </para>
  212. </listitem>
  213. <listitem>
  214. <para>
  215. Pass it as <command>@locale</command> parameter to the assemble
  216. method.
  217. </para>
  218. </listitem>
  219. </itemizedlist>
  220. <para>
  221. Translated segments are separated into two parts. Fixed segments
  222. are prefixed by a single <emphasis>@</emphasis>-sign, and will be
  223. translated to the current locale when assembling and reverted
  224. to the message ID when matching again. Dynamic segments
  225. are prefixed by <command>:@</command>. When assembling, the given
  226. parameter will be translated and inserted into the parameter
  227. position. When matching, the translated parameter from the
  228. <acronym>URL</acronym> will be reverted to the message ID again.
  229. </para>
  230. <note>
  231. <title>Message IDs and separate language file</title>
  232. <para>
  233. Occasionally a message ID which you want to use in one
  234. of your routes is already used in a view script or somewhere
  235. else. To have full control over safe <acronym>URL</acronym>s, you should use
  236. a separate language file for the messages used in the route.
  237. </para>
  238. </note>
  239. <para>
  240. The following is the simplest way to prepare the standard route for
  241. translated segment usage:
  242. </para>
  243. <programlisting language="php"><![CDATA[
  244. // Prepare the translator
  245. $translator = new Zend_Translate(
  246. array(
  247. 'adapter' => 'array',
  248. 'content' => array(),
  249. 'locale' => 'en'
  250. )
  251. );
  252. $translator->addTranslation(
  253. array(
  254. 'content' =>
  255. array(
  256. 'archive' => 'archiv',
  257. 'year' => 'jahr',
  258. 'month' => 'monat',
  259. 'index' => 'uebersicht'
  260. ),
  261. 'locale' => 'de'
  262. )
  263. );
  264. // Set the current locale for the translator
  265. $translator->setLocale('en');
  266. // Set it as default translator for routes
  267. Zend_Controller_Router_Route::setDefaultTranslator($translator);
  268. ]]></programlisting>
  269. <para>
  270. This example demonstrates the usage of static segments:
  271. </para>
  272. <programlisting language="php"><![CDATA[
  273. // Create the route
  274. $route = new Zend_Controller_Router_Route(
  275. '@archive',
  276. array(
  277. 'controller' => 'archive',
  278. 'action' => 'index'
  279. )
  280. );
  281. $router->addRoute('archive', $route);
  282. // Assemble the URL in default locale: archive
  283. $route->assemble(array());
  284. // Assemble the URL in german: archiv
  285. $route->assemble(array());
  286. ]]></programlisting>
  287. <para>
  288. You can use the dynamic segments to create a module-route like
  289. translated version:
  290. </para>
  291. <programlisting language="php"><![CDATA[
  292. // Create the route
  293. $route = new Zend_Controller_Router_Route(
  294. ':@controller/:@action/*',
  295. array(
  296. 'controller' => 'index',
  297. 'action' => 'index'
  298. )
  299. );
  300. $router->addRoute('archive', $route);
  301. // Assemble the URL in default locale: archive/index/foo/bar
  302. $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
  303. // Assemble the URL in german: archiv/uebersicht/foo/bar
  304. $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
  305. ]]></programlisting>
  306. <para>
  307. You can also mix static and dynamic segments:
  308. </para>
  309. <programlisting language="php"><![CDATA[
  310. // Create the route
  311. $route = new Zend_Controller_Router_Route(
  312. '@archive/:@mode/:value',
  313. array(
  314. 'mode' => 'year'
  315. 'value' => 2005,
  316. 'controller' => 'archive',
  317. 'action' => 'show'
  318. ),
  319. array('mode' => '(month|year)'
  320. 'value' => '\d+')
  321. );
  322. $router->addRoute('archive', $route);
  323. // Assemble the URL in default locale: archive/month/5
  324. $route->assemble(array('mode' => 'month', 'value' => '5'));
  325. // Assemble the URL in german: archiv/monat/5
  326. $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));
  327. ]]></programlisting>
  328. </sect4>
  329. </sect3>