Zend_Controller-Router-Route.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17592 -->
  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> es la ruta standard
  8. del framework. Combina la facilidad de uso con la flexibilidad para la
  9. definición de rutas. Cada ruta consiste fundamentalmente en el mapeo de
  10. la <acronym>URL</acronym> (de partes estáticas y dinámicas (variables))
  11. y puede ser iniciada con valores predeterminados así como con requisitos
  12. variables. </para>
  13. <para> Imaginemos que nuestra aplicación ficticia necesitará algunas páginas
  14. informativas sobre los autores del contenido. Queremos ser capaces de
  15. apuntar nuestro navegador web a
  16. <filename>http://domain.com/author/martel</filename> para ver la
  17. información sobre este muchacho "martel". La ruta para esa funcionalidad
  18. podría parecerse a: </para>
  19. <programlisting language="php"><![CDATA[
  20. $route = new Zend_Controller_Router_Route(
  21. 'author/:username',
  22. array(
  23. 'controller' => 'profile',
  24. 'action' => 'userinfo'
  25. )
  26. );
  27. $router->addRoute('user', $route);
  28. ]]></programlisting>
  29. <para> El primer parámetro en el constructor
  30. <classname>Zend_Controller_Router_Route</classname> es una
  31. definición de ruta que será acompañada de una <acronym>URL</acronym>.
  32. Las definiciones de ruta consisten en partes estáticas y dinámicas
  33. separadas por el caracter barra ('/'). Las partes estáticas son simples
  34. textos: <command>author</command>. Las partes dinámicas, llamadas
  35. variables, se marcan anteponiendo dos puntos (:) al nombre de la
  36. variable <command>:username</command>. </para>
  37. <note>
  38. <title>Uso de Caracteres</title>
  39. <para> La implementación actual le permite utilizar cualquier carácter
  40. (salvo una barra) como un identificador de variable, pero se
  41. recomienda encarecidamente que se utilicen sólo caracteres que sean
  42. válidos para identificadores de variables <acronym>PHP</acronym>. En
  43. implementaciones futuras se podría alterar este comportamiento,
  44. resultando en probables fallos escondidos en su código. </para>
  45. </note>
  46. <para> Este ejemplo de ruta debería ser coincidente cuando apunta su
  47. navegador a <filename>http://domain.com/author/martel</filename>, en
  48. cuyo caso todas sus variables se inyectan al objeto
  49. <classname>Zend_Controller_Request</classname> y quedando accesibles
  50. en <classname>ProfileController</classname>. Las variables devueltas
  51. por este ejemplo pueden ser representadas como el siguiente array de
  52. pares clave/valor: </para>
  53. <programlisting language="php"><![CDATA[
  54. $values = array(
  55. 'username' => 'martel',
  56. 'controller' => 'profile',
  57. 'action' => 'userinfo'
  58. );
  59. ]]></programlisting>
  60. <para> Después, <classname>Zend_Controller_Dispatcher_Standard</classname>
  61. debe invocar al método <methodname>userinfoAction()</methodname> de su
  62. clase <classname>ProfileController</classname> (en el módulo por
  63. defecto) basado en estos valores. Allí se podrán acceder a todas las
  64. variables mediante los métodos
  65. <methodname>Zend_Controller_Action::_getParam()</methodname> o
  66. <methodname>Zend_Controller_Request::getParam()</methodname>: </para>
  67. <programlisting language="php"><![CDATA[
  68. public function userinfoAction()
  69. {
  70. $request = $this->getRequest();
  71. $username = $request->getParam('username');
  72. $username = $this->_getParam('username');
  73. }
  74. ]]></programlisting>
  75. <para> La definición de ruta puede contener uno o más caracteres especiales
  76. - un comodín - representado por el símbolo '*'. Se utiliza para reunir
  77. parámetros al igual que el valor de ruta por defecto del Módulo (var =>
  78. pares de valores definidos en la <acronym>URI</acronym>). La siguiente
  79. ruta imita más o menos el comportamiento de la ruta del Módulo: </para>
  80. <programlisting language="php"><![CDATA[
  81. $route = new Zend_Controller_Router_Route(
  82. ':module/:controller/:action/*',
  83. array('module' => 'default')
  84. );
  85. $router->addRoute('default', $route);
  86. ]]></programlisting>
  87. <sect4 id="zend.controller.router.routes.standard.variable-defaults">
  88. <title>Variables por Defecto</title>
  89. <para> Cada variable en la ruta puede tener una valor por defecto y para
  90. esto es que se usa el segundo parámetro del constructor
  91. <classname>Zend_Controller_Router_Route</classname>. Este
  92. parámetro es un array con claves representando los nombres de
  93. variables y con valores como los deseados por defecto: </para>
  94. <programlisting language="php"><![CDATA[
  95. $route = new Zend_Controller_Router_Route(
  96. 'archive/:year',
  97. array('year' => 2006)
  98. );
  99. $router->addRoute('archive', $route);
  100. ]]></programlisting>
  101. <para> La ruta de arriba comparará <acronym>URL</acronym>s como
  102. <filename>http://domain.com/archive/2005</filename> y
  103. <filename>http://example.com/archive</filename>. En este último
  104. caso la variable year(año) tendrá un valor inicial predeterminado de
  105. 2006. </para>
  106. <para> Este ejemplo resultará en inyectar una variable año al objeto
  107. solicitud. Ya que no hay información de enrutamiento presente (no se
  108. define ningún controlador ni parámetros de acción), la solicitud
  109. será enviada al controlador y al método de acción por defecto (que a
  110. la vez ambos están definidos en
  111. <classname>Zend_Controller_Dispatcher_Abstract</classname>).
  112. Para hacerlos más utilizables, tiene que proporcionar un controlador
  113. válido y una acción válida como la ruta por defecto: </para>
  114. <programlisting language="php"><![CDATA[
  115. $route = new Zend_Controller_Router_Route(
  116. 'archive/:year',
  117. array(
  118. 'year' => 2006,
  119. 'controller' => 'archive',
  120. 'action' => 'show'
  121. )
  122. );
  123. $router->addRoute('archive', $route);
  124. ]]></programlisting>
  125. <para> Entonces, esta ruta resultará en el dispatch al método
  126. <methodname>showAction()</methodname> de la clase
  127. <classname>ArchiveController</classname>. </para>
  128. </sect4>
  129. <sect4 id="zend.controller.router.routes.standard.variable-requirements">
  130. <title>Requerimientos para Variables</title>
  131. <para> Podemos agregar un tercer parámetro al constructor
  132. <classname>Zend_Controller_Router_Route</classname> donde
  133. podemos establecer los requisitos para las variables. Estas son
  134. definidas como partes de una expresión regular: </para>
  135. <programlisting language="php"><![CDATA[
  136. $route = new Zend_Controller_Router_Route(
  137. 'archive/:year',
  138. array(
  139. 'year' => 2006,
  140. 'controller' => 'archive',
  141. 'action' => 'show'
  142. ),
  143. array('year' => '\d+')
  144. );
  145. $router->addRoute('archive', $route);
  146. ]]></programlisting>
  147. <para> Con una ruta definida como la de arriba, el router comparará solo
  148. cuando la variable año contenga datos numéricos, eg.
  149. <filename>http://domain.com/archive/2345</filename>. Una
  150. <acronym>URL</acronym> como
  151. <filename>http://example.com/archive/test</filename> no se
  152. comparará y en su lugar el control se pasará a la próxima ruta en la
  153. cadena. </para>
  154. </sect4>
  155. <sect4 id="zend.controller.router.routes.standard.translated-segments">
  156. <title>Segmentos Traducidos</title>
  157. <para> El standard de ruta brinda apoyo a la traducción de segmentos.
  158. Para utilizar esta característica, tiene que definir por lo menos un
  159. traductor (una instancia de <classname>Zend_Translate</classname>)
  160. mediante una de las siguientes formas: </para>
  161. <itemizedlist>
  162. <listitem>
  163. <para> Ponerlo en el registro con la clave
  164. <methodname>Zend_Translate</methodname>. </para>
  165. </listitem>
  166. <listitem>
  167. <para> Setearlo mediante el método estático
  168. <methodname>Zend_Controller_Router_Route::setDefaultTranslator()</methodname>.
  169. </para>
  170. </listitem>
  171. <listitem>
  172. <para> Pasarlo como cuarto parámetro al constructor. </para>
  173. </listitem>
  174. </itemizedlist>
  175. <para> Por defecto, se utilizará el "locale" especificado en la
  176. instancia <classname>Zend_Translate</classname>. Para anularlo, debe
  177. setearlo (como una instancia de <classname>Zend_Locale</classname> o
  178. un string local) de una de las siguientes maneras: </para>
  179. <itemizedlist>
  180. <listitem>
  181. <para> Ponerlo en el registro con la clave
  182. <classname>Zend_Locale</classname>. </para>
  183. </listitem>
  184. <listitem>
  185. <para> Setearlo mediante el método estático
  186. <classname>Zend_Controller_Router_Route::setDefaultLocale()</classname>.
  187. </para>
  188. </listitem>
  189. <listitem>
  190. <para> Pasarlo como cuarto parámetro al constructor. </para>
  191. </listitem>
  192. <listitem>
  193. <para> Pasarlo como parámetro <command>@locale</command>
  194. al método de ensamblaje. </para>
  195. </listitem>
  196. </itemizedlist>
  197. <para> Los segmentos traducidos se dividen en dos partes. Los segmentos
  198. fijos están precedidos por un único signo
  199. <emphasis>@</emphasis>, y serán traducidos al "locale" actual
  200. para el ensamblaje y se revierten al ID del mensaje cuando se acepte
  201. nuevamente. Los segmentos dinámicos tienen el prefijo
  202. <command>:@</command>. Para el ensamblaje, el parámetro
  203. dado será traducido y se insertará en la posición del parámetro.
  204. Cuando se acepte, el parámetro traducido de la URL volverá al ID del
  205. mensaje nuevamente. </para>
  206. <note>
  207. <title>IDs de Mensajes y Archivos de Lenguajes Separados</title>
  208. <para> Ocasionalmente un ID de mensaje que quiere usar en una de sus
  209. rutas ya se utiliza en un view script o en otro lugar. Para
  210. tener pleno control sobre <acronym>URL</acronym>s seguras, debe
  211. usar un archivo de idioma separado para los mensajes utilizados
  212. en la ruta. </para>
  213. </note>
  214. <para> La siguiente es la forma más sencilla para preparar el itinerario
  215. normal para el uso de la traducción del segmento: </para>
  216. <programlisting language="php"><![CDATA[
  217. // Prepare el traductor
  218. $translator = new Zend_Translate('array', array(), 'en');
  219. $translator->addTranslation(array('archive' => 'archiv',
  220. 'year' => 'jahr',
  221. 'month' => 'monat',
  222. 'index' => 'uebersicht'),
  223. 'de');
  224. // Establecer el "locale" actual para el traductor
  225. $translator->setLocale('en');
  226. // Establecerlo como traductor por defecto para las rutas
  227. Zend_Controller_Router_Route::setDefaultTranslator($translator);
  228. ]]></programlisting>
  229. <para> Este ejemplo demuestra el uso de segmentos estáticos: </para>
  230. <programlisting language="php"><![CDATA[
  231. // Crear la ruta
  232. $route = new Zend_Controller_Router_Route(
  233. '@archive',
  234. array(
  235. 'controller' => 'archive',
  236. 'action' => 'index'
  237. )
  238. );
  239. $router->addRoute('archive', $route);
  240. // Ensamblar la URL en el locale actual por defecto: archive
  241. $route->assemble(array());
  242. // Ensamblar la URL en alemán: archiv
  243. $route->assemble(array());
  244. ]]></programlisting>
  245. <para> Puede usar segmentos dinámicos para crear veriones traducidas
  246. como del tipo módulo-ruta: </para>
  247. <programlisting language="php"><![CDATA[
  248. // Crear la ruta
  249. $route = new Zend_Controller_Router_Route(
  250. ':@controller/:@action/*',
  251. array(
  252. 'controller' => 'index',
  253. 'action' => 'index'
  254. )
  255. );
  256. $router->addRoute('archive', $route);
  257. // Ensamblar la URL en el "locale" por defecto: archive/index/foo/bar
  258. $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
  259. // Ensamblar la URL en alemán: archiv/uebersicht/foo/bar
  260. $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
  261. ]]></programlisting>
  262. <para> También puede mezclar segmentos estáticos y dinámicos: </para>
  263. <programlisting language="php"><![CDATA[
  264. // Crear la ruta
  265. $route = new Zend_Controller_Router_Route(
  266. '@archive/:@mode/:value',
  267. array(
  268. 'mode' => 'year'
  269. 'value' => 2005,
  270. 'controller' => 'archive',
  271. 'action' => 'show'
  272. ),
  273. array('mode' => '(month|year)'
  274. 'value' => '\d+')
  275. );
  276. $router->addRoute('archive', $route);
  277. // Ensamblar la URL en el "locale" por defecto: archive/month/5
  278. $route->assemble(array('mode' => 'month', 'value' => '5'));
  279. // Ensamblar la URL en alemán: archiv/monat/5
  280. $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));
  281. ]]></programlisting>
  282. </sect4>
  283. </sect3>