Zend_Controller-Router-Route.xml 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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> 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. </sect3>