Zend_Controller-Router-Route-Chain.xml 8.7 KB

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