1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 17592 -->
4 <sect3 id="zend.controller.router.routes.standard">
5 <title>Zend_Controller_Router_Route</title>
8 <classname>Zend_Controller_Router_Route</classname>
10 del framework. Combina la facilidad de uso con la flexibilidad para la
11 definición de rutas. Cada ruta consiste fundamentalmente en el mapeo de
13 <acronym>URL</acronym>
14 (de partes estáticas y dinámicas (variables))
15 y puede ser iniciada con valores
16 predeterminados así como con requisitos
21 Imaginemos que nuestra aplicación ficticia necesitará algunas páginas
22 informativas sobre los
23 autores del contenido. Queremos ser capaces de
24 apuntar nuestro navegador web a
25 <filename>http://domain.com/author/martel</filename>
27 información sobre este muchacho "martel". La ruta para esa funcionalidad
32 <programlisting language="php"><![CDATA[
33 $route = new Zend_Controller_Router_Route(
36 'controller' => 'profile',
37 'action' => 'userinfo'
41 $router->addRoute('user', $route);
45 El primer parámetro en el constructor
46 <classname>Zend_Controller_Router_Route</classname>
48 definición de ruta que será acompañada de una
49 <acronym>URL</acronym>
51 Las definiciones de ruta consisten en partes estáticas y dinámicas
52 separadas por el caracter
53 barra ('/'). Las partes estáticas son simples
55 <command>author</command>
56 . Las partes dinámicas, llamadas
57 variables, se marcan anteponiendo dos puntos (:) al nombre
60 <command>:username</command>
65 <title>Uso de Caracteres</title>
67 La implementación actual le permite utilizar cualquier carácter
68 (salvo una barra) como un
69 identificador de variable, pero se
70 recomienda encarecidamente que se utilicen sólo
72 válidos para identificadores de variables
73 <acronym>PHP</acronym>
75 implementaciones futuras se podría alterar este comportamiento,
77 probables fallos escondidos en su código.
82 Este ejemplo de ruta debería ser coincidente cuando apunta su
84 <filename>http://domain.com/author/martel</filename>
86 cuyo caso todas sus variables se inyectan al objeto
87 <classname>Zend_Controller_Request</classname>
90 <classname>ProfileController</classname>
91 . Las variables devueltas
92 por este ejemplo pueden ser representadas como el siguiente array
97 <programlisting language="php"><![CDATA[
99 'username' => 'martel',
100 'controller' => 'profile',
101 'action' => 'userinfo'
107 <classname>Zend_Controller_Dispatcher_Standard</classname>
108 debe invocar al método
109 <methodname>userinfoAction()</methodname>
112 <classname>ProfileController</classname>
114 defecto) basado en estos valores. Allí se podrán acceder a todas las
115 variables mediante los métodos
116 <methodname>Zend_Controller_Action::_getParam()</methodname>
118 <methodname>Zend_Controller_Request::getParam()</methodname>
122 <programlisting language="php"><![CDATA[
123 public function userinfoAction()
125 $request = $this->getRequest();
126 $username = $request->getParam('username');
128 $username = $this->_getParam('username');
133 La definición de ruta puede contener uno o más caracteres especiales
135 representado por el símbolo '*'. Se utiliza para reunir
136 parámetros al igual que el valor de
137 ruta por defecto del Módulo (var =>
138 pares de valores definidos en la
139 <acronym>URI</acronym>
141 ruta imita más o menos el comportamiento de la ruta del Módulo:
144 <programlisting language="php"><![CDATA[
145 $route = new Zend_Controller_Router_Route(
146 ':module/:controller/:action/*',
147 array('module' => 'default')
149 $router->addRoute('default', $route);
152 <sect4 id="zend.controller.router.routes.standard.variable-defaults">
153 <title>Variables por Defecto</title>
156 Cada variable en la ruta puede tener una valor por defecto y para
157 esto es que se usa el
158 segundo parámetro del constructor
159 <classname>Zend_Controller_Router_Route</classname>
161 parámetro es un array con claves representando los nombres de
163 valores como los deseados por defecto:
166 <programlisting language="php"><![CDATA[
167 $route = new Zend_Controller_Router_Route(
169 array('year' => 2006)
171 $router->addRoute('archive', $route);
175 La ruta de arriba comparará
176 <acronym>URL</acronym>
178 <filename>http://domain.com/archive/2005</filename>
180 <filename>http://example.com/archive</filename>
182 caso la variable year(año) tendrá un valor inicial predeterminado de
187 Este ejemplo resultará en inyectar una variable año al objeto
188 solicitud. Ya que no hay
189 información de enrutamiento presente (no se
190 define ningún controlador ni parámetros de
191 acción), la solicitud
192 será enviada al controlador y al método de acción por defecto (que
194 la vez ambos están definidos en
195 <classname>Zend_Controller_Dispatcher_Abstract</classname>
197 Para hacerlos más utilizables, tiene que proporcionar un controlador
199 acción válida como la ruta por defecto:
202 <programlisting language="php"><![CDATA[
203 $route = new Zend_Controller_Router_Route(
207 'controller' => 'archive',
211 $router->addRoute('archive', $route);
215 Entonces, esta ruta resultará en el dispatch al método
216 <methodname>showAction()</methodname>
218 <classname>ArchiveController</classname>
224 <sect4 id="zend.controller.router.routes.standard.variable-requirements">
225 <title>Requerimientos para Variables</title>
228 Podemos agregar un tercer parámetro al constructor
229 <classname>Zend_Controller_Router_Route</classname>
231 podemos establecer los requisitos para las variables. Estas son
233 partes de una expresión regular:
236 <programlisting language="php"><![CDATA[
237 $route = new Zend_Controller_Router_Route(
241 'controller' => 'archive',
244 array('year' => '\d+')
246 $router->addRoute('archive', $route);
250 Con una ruta definida como la de arriba, el router comparará solo
251 cuando la variable año
252 contenga datos numéricos, eg.
253 <filename>http://domain.com/archive/2345</filename>
255 <acronym>URL</acronym>
257 <filename>http://example.com/archive/test</filename>
259 comparará y en su lugar el control se pasará a la próxima ruta en la
264 <sect4 id="zend.controller.router.routes.standard.translated-segments">
265 <title>Segmentos Traducidos</title>
268 El standard de ruta brinda apoyo a la traducción de segmentos.
270 característica, tiene que definir por lo menos un
271 traductor (una instancia de
272 <classname>Zend_Translate</classname>
274 mediante una de las siguientes formas:
280 Ponerlo en el registro con la clave
281 <classname>Zend_Translate</classname>
287 Setearlo mediante el método estático
288 <methodname>Zend_Controller_Router_Route::setDefaultTranslator()</methodname>
293 <para>Pasarlo como cuarto parámetro al constructor.</para>
298 Por defecto, se utilizará el "locale" especificado en la
300 <classname>Zend_Translate</classname>
301 . Para anularlo, debe
302 setearlo (como una instancia de
303 <classname>Zend_Locale</classname>
305 un string local) de una de las siguientes maneras:
311 Ponerlo en el registro con la clave
312 <classname>Zend_Locale</classname>
318 Setearlo mediante el método estático
319 <methodname>Zend_Controller_Router_Route::setDefaultLocale()</methodname>
324 <para>Pasarlo como cuarto parámetro al constructor.</para>
328 Pasarlo como parámetro
329 <command>@locale</command>
330 al método de ensamblaje.
336 Los segmentos traducidos se dividen en dos partes. Los segmentos
337 fijos están precedidos
339 <emphasis>@</emphasis>
340 , y serán traducidos al "locale" actual
341 para el ensamblaje y se revierten al ID del
342 mensaje cuando se acepte
343 nuevamente. Los segmentos dinámicos tienen el prefijo
344 <command>:@</command>
345 . Para el ensamblaje, el parámetro
346 dado será traducido y se insertará en la posición del
348 Cuando se acepte, el parámetro traducido de la URL volverá al ID del
354 <title>IDs de Mensajes y Archivos de Lenguajes Separados</title>
356 Ocasionalmente un ID de mensaje que quiere usar en una de sus
357 rutas ya se utiliza en
358 un view script o en otro lugar. Para
359 tener pleno control sobre
360 <acronym>URL</acronym>
362 usar un archivo de idioma separado para los mensajes utilizados
368 <para>La siguiente es la forma más sencilla para preparar el itinerario
369 normal para el uso de
370 la traducción del segmento:</para>
372 <programlisting language="php"><![CDATA[
373 // Prepare el traductor
374 $translator = new Zend_Translate('array', array(), 'en');
375 $translator->addTranslation(array('archive' => 'archiv',
378 'index' => 'uebersicht'),
381 // Establecer el "locale" actual para el traductor
382 $translator->setLocale('en');
384 // Establecerlo como traductor por defecto para las rutas
385 Zend_Controller_Router_Route::setDefaultTranslator($translator);
388 <para>Este ejemplo demuestra el uso de segmentos estáticos:</para>
390 <programlisting language="php"><![CDATA[
392 $route = new Zend_Controller_Router_Route(
395 'controller' => 'archive',
399 $router->addRoute('archive', $route);
401 // Ensamblar la URL en el locale actual por defecto: archive
402 $route->assemble(array());
404 // Ensamblar la URL en alemán: archiv
405 $route->assemble(array());
408 <para>Puede usar segmentos dinámicos para crear veriones traducidas
412 <programlisting language="php"><![CDATA[
414 $route = new Zend_Controller_Router_Route(
415 ':@controller/:@action/*',
417 'controller' => 'index',
421 $router->addRoute('archive', $route);
423 // Ensamblar la URL en el "locale" por defecto: archive/index/foo/bar
424 $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
426 // Ensamblar la URL en alemán: archiv/uebersicht/foo/bar
427 $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
430 <para>También puede mezclar segmentos estáticos y dinámicos:</para>
432 <programlisting language="php"><![CDATA[
434 $route = new Zend_Controller_Router_Route(
435 '@archive/:@mode/:value',
439 'controller' => 'archive',
442 array('mode' => '(month|year)'
445 $router->addRoute('archive', $route);
447 // Ensamblar la URL en el "locale" por defecto: archive/month/5
448 $route->assemble(array('mode' => 'month', 'value' => '5'));
450 // Ensamblar la URL en alemán: archiv/monat/5
451 $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));