Zend_Controller-Router-Route.xml 14 KB

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