Las rutas de Symfony son objetos de tipo ~sfRoute
~ que tienen dos importantes
tareas:
- Generar URL: si por ejemplo se pasa al método
page_show
un parámetro llamadoslug
, debería ser capaz de generar una URL real (por ejemplo,/location
). - Procesar las URL entrantes: a partir de la URL de una petición, cada ruta debe ser capaz de determinar si la URL cumple los requisitos de la ruta.
La información de cada ruta individual normalmente se configura en el archivo
app/mi_aplicacion/config/routing.yml
que se encuentra en el directorio de configuración
de cada aplicación. Si una ruta es "un objeto de tipo sfRoute
", ¿cómo se transforma
la configuración YAML en objetos sfRoute
?
2.2.1. Gestor de configuración de la cache del enrutamiento
Aunque las rutas se definen en un archivo YAML, cada entrada de ese archivo se
transforma en un objeto durante la petición mediante un tipo especial de clase
llamada gestor de configuración de la cache. El resultado es código PHP que representa a todas
y cada una de las rutas de la aplicación. Aunque los detalles de funcionamiento
de este proceso están fuera del alcance de este capítulo, se muestra a continuación
parte de la versión compilada final de la ruta page_show
. El archivo compilado
se encuentra en cache/mi_aplicacion/mi_entorno/config/config_routing.yml.php
y depende de la aplicación y del entorno. A continuación se muestra un pequeño
extracto de la ruta page_show
completa:
new sfDoctrineRoute('/:slug', array (
'module' => 'page',
'action' => 'show',
), array (
'slug' => '[^/\\.]+',
), array (
'model' => 'Page',
'type' => 'object',
));
Nota El nombre de la clase de cada ruta se define en la clave class
del archivo
routing.yml
. Si no se especifica una clave class
, por defecto se considera
que es una clase de tipo sfRoute
. Otra clase de ruta común es sfRequestRoute
que permite al programador crear rutas RESTful. El libro
The symfony Reference Book
incluye la lista completa de clases de ruta y todas sus opciones.
2.2.2. Asociando una petición con una ruta específica
Una de las tareas principales del framework de enrutamiento consiste en asociar
cada URL entrante con su objeto de ruta correcto. La clase ~sfPatternRouting
~
es el núcleo central del enrutamiento y se encarga de realizar este proceso. A
pesar de su importancia, los programadores no interactúan casi nunca de forma
directa con sfPatternRouting
.
Para asociar la ruta correcta, sfPatternRouting
itera por cada clase sfRoute
preguntando si el patrón de la ruta coincide con la URL entrante. Internamente
sfPatternRouting
ejecuta el método sfRoute::matchesUrl()
sobre cada
objeto de ruta. Este método simplemente devuelve false
si el patrón de la ruta
no coincide con la URL entrante.
Cuando el patrón de la ruta coincide, el método sfRoute::matchesUrl()
hace
mucho más que devolver true
. En este caso, la ruta devuelve un array de
parámetros que se incluyen en el objeto de la petición. La URL
http://pete.sympalbuilder.com/location
por ejemplo está asociada con la ruta
page_show
, cuyo método matchesUrl()
devolvería el siguiente array:
array('slug' => 'location')
Esta información se incluye después en el objeto de la petición, por lo que es
posible acceder a las variables de la ruta (por ejemplo slug
) desde las acciones
y otros lugares del proyecto.
$this->slug = $request->getParameter('slug');
Como puede que ya hayas adivinado, redefinir el método sfRoute::matchesUrl()
es la mejor forma de personalizar las rutas para que hagan cualquier cosa.