Zend_Controller-Router-Route-Chain.xml 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.router.routes.chain">
  5. <title>Zend_Controller_Router_Route_Chain</title>
  6. <para>
  7. <classname>Zend_Controller_Router_Route_Chain</classname> es una ruta
  8. que permite encadenar juntas a múltiples rutas.
  9. Esto le permite encadenar hostname/rutas y rutas de paths, o múltiples
  10. paths de rutas por ejemplo. El encadenamiento puede hacerse
  11. programáticamente o dentro de un archivo de configuración.
  12. </para>
  13. <note>
  14. <title>Prioridad de Parámetros</title>
  15. <para>
  16. Cuando se encadenan en conjunto varias rutas, los parámetros de la
  17. ruta exterior tienen mayor prioridad que los parámetros de la ruta
  18. interior. Así, si define un controlador en el exterior y otro en
  19. la ruta interior, será seleccionado el controlador de la ruta exterior.
  20. </para>
  21. </note>
  22. <para>
  23. Cuando el encadenamiento se realiza prográmaticamente, hay dos maneras
  24. de archivarlo. La primera consiste en crear una nueva instancia
  25. <classname>Zend_Controller_Router_Route_Chain</classname> y entones
  26. llamar al método <methodname>chain</methodname> varias veces con todas las rutas
  27. que deberían encadenarse juntas. La otra forma es tomar la primera
  28. ruta, por ejemplo, la ruta del nombre del host, y llamar al método
  29. <methodname>chain</methodname> con la ruta que debería ser anexada a ella.
  30. Esto no modificará la ruta del nombre del host, pero devolverá una nueva
  31. instancia de <classname>Zend_Controller_Router_Route_Chain</classname>,
  32. teniendo entonces a ambas rutas encadenadas juntas:
  33. </para>
  34. <programlisting language="php"><![CDATA[
  35. // Crear dos rutas
  36. $hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
  37. $pathRoute = new Zend_Controller_Router_Route(...);
  38. // Primera manera, encadenarlas con chain route
  39. $chainedRoute = new Zend_Controller_Router_Route_Chain();
  40. $chainedRoute->chain($hostnameRoute)
  41. ->chain($pathRoute);
  42. // Segunda manera, encadenarlas directamente
  43. $chainedRoute = $hostnameRoute->chain($pathRoute);
  44. ]]></programlisting>
  45. <para>
  46. Cuando las rutas se encadenan juntas, su separador por defecto es una
  47. barra ('/'). Pueden haber casos cuando quiera tener un separador
  48. diferente:
  49. </para>
  50. <programlisting language="php"><![CDATA[
  51. // Crear dos rutas
  52. $firstRoute = new Zend_Controller_Router_Route('foo');
  53. $secondRoute = new Zend_Controller_Router_Route('bar');
  54. // Encadenarlas juntas con un separador diferente
  55. $chainedRoute = $firstRoute->chain($secondRoute, '-');
  56. // Ensamblar la ruta: "foo-bar"
  57. echo $chainedRoute->assemble();
  58. ]]></programlisting>
  59. <sect4 id="zend.controller.router.routes.chain.config">
  60. <title>Encadenar Rutas via <classname>Zend_Config</classname></title>
  61. <para>
  62. Para encadenar juntas a las rutas en un archivo de configuración,
  63. hay parámetros adicionales para la configuración de aquellos.
  64. El enfoque más sencillo es utilizar los parámetros <methodname>chains</methodname>.
  65. Este es simplemente una lista de las rutas, que será encadenada con
  66. la ruta padre. Ni la ruta padre ni la ruta hijo serán añadidos
  67. directamente al router sino que sólo lo hará la ruta del
  68. encadenamiento resultante.
  69. El nombre de la ruta encadenada en el router será el nombre de la
  70. ruta padre concatenada con un guión ('-') con el nombre de la ruta
  71. hijo. Un simple config en XML se vería así:
  72. </para>
  73. <programlisting language="xml"><![CDATA[
  74. <routes>
  75. <www type="Zend_Controller_Router_Route_Hostname">
  76. <route>www.example.com</route>
  77. <chains>
  78. <language type="Zend_Controller_Router_Route">
  79. <route>:language</route>
  80. <reqs language="[a-z]{2}">
  81. <chains>
  82. <index type="Zend_Controller_Router_Route_Static">
  83. <route></route>
  84. <defaults module="default" controller="index" action="index" />
  85. </index>
  86. <imprint type="Zend_Controller_Router_Route_Static">
  87. <route>imprint</route>
  88. <defaults module="default" controller="index" action="index" />
  89. </imprint>
  90. </chains>
  91. </language>
  92. </chains>
  93. </www>
  94. <users type="Zend_Controller_Router_Route_Hostname">
  95. <route>users.example.com</route>
  96. <chains>
  97. <profile type="Zend_Controller_Router_Route">
  98. <route>:username</route>
  99. <defaults module="users" controller="profile" action="index" />
  100. </profile>
  101. </chains>
  102. </users>
  103. <misc type="Zend_Controller_Router_Route_Static">
  104. <route>misc</route>
  105. </misc>
  106. </routes>
  107. ]]></programlisting>
  108. <para>
  109. Esto se traducirá en las tres rutas <methodname>www-language-index</methodname>,
  110. <methodname>www-language-imprint</methodname> y
  111. <methodname>users-language-profile</methodname> que sólo concordarán basados
  112. en el nombre y la ruta <methodname>misc</methodname>, que se comparará con
  113. cualquier nombre de host.
  114. </para>
  115. <para>
  116. La manera alternativa de crear una ruta encadenada es a través del
  117. parámetro <methodname>chain</methodname>, que sólo puede utilizarse
  118. directamente con el tipo cadena-ruta, y también trabaja en el nivel raíz:
  119. </para>
  120. <programlisting language="xml"><![CDATA[
  121. <routes>
  122. <www type="Zend_Controller_Router_Route_Chain">
  123. <route>www.example.com</route>
  124. </www>
  125. <language type="Zend_Controller_Router_Route">
  126. <route>:language</route>
  127. <reqs language="[a-z]{2}">
  128. </language>
  129. <index type="Zend_Controller_Router_Route_Static">
  130. <route></route>
  131. <defaults module="default" controller="index" action="index" />
  132. </index>
  133. <imprint type="Zend_Controller_Router_Route_Static">
  134. <route>imprint</route>
  135. <defaults module="default" controller="index" action="index" />
  136. </imprint>
  137. <www-index type="Zend_Controller_Router_Route_Chain">
  138. <chain>www, language, index</chain>
  139. </www-index>
  140. <www-imprint type="Zend_Controller_Router_Route_Chain">
  141. <chain>www, language, imprint</chain>
  142. </www-imprint>
  143. </routes>
  144. ]]></programlisting>
  145. <para>
  146. También puede darle el parámetro a <methodname>chain</methodname> como un array
  147. en vez de separ las rutas con comas:
  148. </para>
  149. <programlisting language="xml"><![CDATA[
  150. <routes>
  151. <www-index type="Zend_Controller_Router_Route_Chain">
  152. <chain>www</chain>
  153. <chain>language</chain>
  154. <chain>index</chain>
  155. </www-index>
  156. <www-imprint type="Zend_Controller_Router_Route_Chain">
  157. <chain>www</chain>
  158. <chain>language</chain>
  159. <chain>imprint</chain>
  160. </www-imprint>
  161. </routes>
  162. ]]></programlisting>
  163. </sect4>
  164. </sect3>
  165. <!--
  166. vim:se ts=4 sw=4 et:
  167. -->