Zend_Controller-Router-Route-Chain.xml 8.3 KB

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