1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 17592 -->
4 <sect3 id="zend.controller.router.routes.regex">
5 <title>Zend_Controller_Router_Route_Regex</title>
7 <para>Además de los tipos de ruta estáticos y por defecto, también está
9 ruta Expresión Regular. Esta ruta ofrece más
10 potencia y flexibilidad que los otros, pero a
11 costa de un ligero aumento
12 en la complejidad. Al mismo tiempo, debería ser más rápido que la
13 standard Route.</para>
15 <para>Al igual que la standard Route, esta ruta tiene que ser inicializada
17 ruta y algunos valores predeterminados. Vamos a
18 crear un archivo ruta como un ejemplo,
19 similar al previamente definido,
20 sólo que esta vez usaremos la ruta Regex:</para>
22 <programlisting language="php"><![CDATA[
23 $route = new Zend_Controller_Router_Route_Regex(
26 'controller' => 'archive',
30 $router->addRoute('archive', $route);
34 Cada sub-patrón regex definido será inyectado al objeto solicitud.
36 anterior, después de un matching exitoso
37 <filename>http://domain.com/archive/2006</filename>
39 resultante del array puede verse como:
42 <programlisting language="php"><![CDATA[
45 'controller' => 'archive',
52 Las barras de comienzo y final están recortadas de la
53 <acronym>URL</acronym>
54 en el Router antes de una concordancia.
55 Como resultado, coincidendo con la
56 <acronym>URL</acronym>
57 <filename>http://domain.com/foo/bar/</filename>
60 <filename>foo/bar</filename>
62 <filename>/foo/bar</filename>
68 <para>Las anclas de comienzo y fin de línea ('^' y '$',
69 respectivamente) son automáticamente
70 antepuestas y pospuestas a
71 todas las expresiones. Así, no debe usar éstas en sus
73 regulares, y debe coincidir con el string completo.</para>
78 Esta clase de ruta usa el carácter
79 <emphasis>#</emphasis>
80 como un delimitador. Esto significa que necesitará caracteres hash
82 pero no barras ('/') en sus definiciones de ruta.
83 Dado que el carácter '#' (llamado
84 ancla) es raramente pasado al
85 webserver, será muy rara la necesidad de utilizar ese
91 <para>Puede obtener el contenido de los sub-patrones definidos por la forma
94 <programlisting language="php"><![CDATA[
95 public function showAction()
97 $request = $this->getRequest();
98 $year = $request->getParam(1); // $year = '2006';
103 <para>Tenga en cuenta que la clave es un entero (1) en lugar de un
107 <para>Sin embargo, esta ruta no funciona exactamente igual que su
108 contraparte standard route dado
109 que el valor por defecto para 'year'
110 todavía no se ha establecido. Y lo que puede ser no tan
112 tendremos un problema con una barra final incluso si declaramos por
114 año y hacemos opcional al sub-patrón. La solución es hacer
115 que toda la parte del año sea
116 opcional junto con la barra pero capturar
117 solo la parte numérica:</para>
119 <programlisting language="php"><![CDATA[
120 $route = new Zend_Controller_Router_Route_Regex(
121 'archive(?:/(\d+))?',
124 'controller' => 'archive',
128 $router->addRoute('archive', $route);
131 <para>Ahora, ocupemósnos del problema que probablemente haya notado.
132 Utilizar claves basadas en
133 enteros para los parámetros no es una
134 solución fácilmente manejable y puede ser
135 potencialmente problemática a
136 largo plazo. Y aquí es donde entra el tercer parámetro. Este
138 es un array asociativo que representa un mapa de sub-patrones regex a
140 clave de parámetros. Trabajemos en nuestro ejemplo más fácil:</para>
142 <programlisting language="php"><![CDATA[
143 $route = new Zend_Controller_Router_Route_Regex(
146 'controller' => 'archive',
153 $router->addRoute('archive', $route);
156 <para>Esto resultaraá en los siguientes valores inyectados a la solicitud:</para>
158 <programlisting language="php"><![CDATA[
161 'controller' => 'archive',
166 <para>El mapa puede ser definido en cualquier dirección para hacer que
167 funcione en cualquier
168 ambiente. Las claves pueden contener nombres de
169 variables o índices de sub-patrones:</para>
171 <programlisting language="php"><![CDATA[
172 $route = new Zend_Controller_Router_Route_Regex(
180 $route = new Zend_Controller_Router_Route_Regex(
188 <para>Las claves de los sub-patrones deben respresentarse por enteros.
192 <para>Observe que el índice numérico en los valores del Request ahora han
194 lugar se muestra una variable nombrada. Por
195 supuesto que puede mezclar variables nombradas y
196 numéricas si lo desea:</para>
198 <programlisting language="php"><![CDATA[
199 $route = new Zend_Controller_Router_Route_Regex(
200 'archive/(\d+)/page/(\d+)',
207 Lo que resultará en una mezcla de valores disponibles en la
208 solicitud. Como ejemplo, la
209 <acronym>URL</acronym>
210 <filename>http://domain.com/archive/2006/page/10</filename>
212 con los siguientes valores:
215 <programlisting language="php"><![CDATA[
219 'controller' => 'archive',
225 Dado que los patrones regex no pueden invertirse fácilmente, tendrá
227 <acronym>URL</acronym>
228 inversa si desea usar un
230 <acronym>URL</acronym>
231 o incluso un método de ensamble de
232 esta clase. Este path inverso está representado por un
235 <methodname>sprintf()</methodname>
236 y se define como el cuarto parámetro del constructor:
239 <programlisting language="php"><![CDATA[
240 $route = new Zend_Controller_Router_Route_Regex(
249 Todo esto es algo que ya fue posible de hacer por medio de un objeto
250 de ruta estandard, por
251 lo tanto podría preguntarese: ¿cuál es la ventaja
252 de utilizar la ruta Regex?. Principalmente,
255 <acronym>URL</acronym>
256 sin restricción alguna.
257 Imagínese que tiene un blog y desea crear URLs como:
258 <filename>http://domain.com/blog/archive/01-Using_the_Regex_Router.html</filename>
260 y que tiene que descomponer el último elemento del path
261 <filename>01-Using_the_Regex_Router.html</filename>
263 artículo y en el título o descripción del artículo; esto no es posible con
265 standard route. Con la ruta Regex, puede hacer algo como la siguiente
269 <programlisting language="php"><![CDATA[
270 $route = new Zend_Controller_Router_Route_Regex(
271 'blog/archive/(\d+)-(.+)\.html',
273 'controller' => 'blog',
280 'blog/archive/%d-%s.html'
282 $router->addRoute('blogArchive', $route);
285 <para>Como puede ver, esto añade una enorme cantidad de flexibilidad por