Zend_Controller-Router-Route.xml 15 KB

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