Más con Symfony

2.2. Cómo funciona el sistema de enrutamiento

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 llamado slug, 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.