update DOC-ES
[zend.git] / documentation / manual / es / module_specs / Zend_Controller-Router-Route-Regex.xml
blob8724968cf5ecf786b4cdd5ef3336837b97ac4aec
1 <?xml version="1.0" encoding="UTF-8"?>
2     <!-- EN-Revision: 17592 -->
3     <!-- Reviewed: no -->
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á
8         disponible el tipo de
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
16         con una definición de
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(
24     'archive/(\d+)',
25     array(
26         'controller' => 'archive',
27         'action'     => 'show'
28     )
30 $router->addRoute('archive', $route);
31 ]]></programlisting>
33     <para>
34         Cada sub-patrón regex definido será inyectado al objeto solicitud.
35         Con nuestro ejemplo
36         anterior, después de un matching exitoso
37         <filename>http://domain.com/archive/2006</filename>
38         , el valor
39         resultante del array puede verse como:
40     </para>
42     <programlisting language="php"><![CDATA[
43 $values = array(
44     1            => '2006',
45     'controller' => 'archive',
46     'action'     => 'show'
48 ]]></programlisting>
50     <note>
51         <para>
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>
58             , involucraría al
59             regex de
60             <filename>foo/bar</filename>
61             , y no a
62             <filename>/foo/bar</filename>
63             .
64         </para>
65     </note>
67     <note>
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
72             expresiones
73             regulares, y debe coincidir con el string completo.</para>
74     </note>
76     <note>
77         <para>
78             Esta clase de ruta usa el carácter
79             <emphasis>#</emphasis>
80             como un delimitador. Esto significa que necesitará caracteres hash
81             ('#') para escapar
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
86             carácter en su
87             regex.
88         </para>
89     </note>
91     <para>Puede obtener el contenido de los sub-patrones definidos por la forma
92         habitual:</para>
94     <programlisting language="php"><![CDATA[
95 public function showAction()
97     $request = $this->getRequest();
98     $year    = $request->getParam(1); // $year = '2006';
100 ]]></programlisting>
102     <note>
103         <para>Tenga en cuenta que la clave es un entero (1) en lugar de un
104             string ('1').</para>
105     </note>
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
111         evidente es que
112         tendremos un problema con una barra final incluso si declaramos por
113         defecto el
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+))?',
122     array(
123         1            => '2006',
124         'controller' => 'archive',
125         'action'     => 'show'
126     )
128 $router->addRoute('archive', $route);
129 ]]></programlisting>
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
137         parámetro
138         es un array asociativo que representa un mapa de sub-patrones regex a
139         nombres de
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(
144     'archive/(\d+)',
145     array(
146         'controller' => 'archive',
147         'action' => 'show'
148     ),
149     array(
150         1 => 'year'
151     )
153 $router->addRoute('archive', $route);
154 ]]></programlisting>
156     <para>Esto resultaraá en los siguientes valores inyectados a la solicitud:</para>
158     <programlisting language="php"><![CDATA[
159 $values = array(
160     'year'       => '2006',
161     'controller' => 'archive',
162     'action'     => 'show'
164 ]]></programlisting>
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(
173     'archive/(\d+)',
174     array( ... ),
175     array(1 => 'year')
178 // O
180 $route = new Zend_Controller_Router_Route_Regex(
181     'archive/(\d+)',
182     array( ... ),
183     array('year' => 1)
185 ]]></programlisting>
187     <note>
188         <para>Las claves de los sub-patrones deben respresentarse por enteros.
189        </para>
190     </note>
192     <para>Observe que el índice numérico en los valores del Request ahora han
193         desaparecido y en su
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+)',
201     array( ... ),
202     array('year' => 1)
204 ]]></programlisting>
206     <para>
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>
211         resultará
212         con los siguientes valores:
213     </para>
215     <programlisting language="php"><![CDATA[
216 $values = array(
217     'year'       => '2006',
218     2            => 10,
219     'controller' => 'archive',
220     'action'     => 'show'
222 ]]></programlisting>
224     <para>
225         Dado que los patrones regex no pueden invertirse fácilmente, tendrá
226         que preparar una
227         <acronym>URL</acronym>
228         inversa si desea usar un
229         ayudante de
230         <acronym>URL</acronym>
231         o incluso un método de ensamble de
232         esta clase. Este path inverso está representado por un
233         string parseable
234         por
235         <methodname>sprintf()</methodname>
236         y se define como el cuarto parámetro del constructor:
237     </para>
239     <programlisting language="php"><![CDATA[
240 $route = new Zend_Controller_Router_Route_Regex(
241     'archive/(\d+)',
242     array( ... ),
243     array('year' => 1),
244     'archive/%s'
246 ]]></programlisting>
248     <para>
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,
253         le permite describir
254         cualquier tipo de
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>
259         ,
260         y que tiene que descomponer el último elemento del path
261         <filename>01-Using_the_Regex_Router.html</filename>
262         , en un ID de
263         artículo y en el título o descripción del artículo; esto no es posible con
264         el
265         standard route. Con la ruta Regex, puede hacer algo como la siguiente
266         solución:
267     </para>
269     <programlisting language="php"><![CDATA[
270 $route = new Zend_Controller_Router_Route_Regex(
271     'blog/archive/(\d+)-(.+)\.html',
272     array(
273         'controller' => 'blog',
274         'action'     => 'view'
275     ),
276     array(
277         1 => 'id',
278         2 => 'description'
279     ),
280     'blog/archive/%d-%s.html'
282 $router->addRoute('blogArchive', $route);
283 ]]></programlisting>
285     <para>Como puede ver, esto añade una enorme cantidad de flexibilidad por
286         encima del standard
287         route.</para>
288 </sect3>