Ver índice de contenidos del libro

5.2. Configurando el enrutamiento

La conversión entre URI internas y URL externas se define en el archivo de configuración routing.yml:

# apps/frontend/config/routing.yml
homepage:
  url:   /
  param: { module: default, action: index }

default_index:
  url:   /:module
  param: { action: index }

default:
  url:   /:module/:action/*

El archivo routing.yml describe las rutas de la aplicación. Cada ruta está formada por un nombre (homepage), un patrón (/:module/:action/*) y unos parámetros (dentro de la opción param).

Cuando la aplicación recibe una petición, el sistema de enrutamiento trata de encontrar el patrón que coincide con la URL solicitada. El orden en el que se añaden las rutas al archivo routing.yml es muy importante, ya que siempre se utiliza la primera ruta cuyo patrón cumple las condiciones de la URL y siempre se empieza a buscar desde la primera hasta la última ruta. A continuación vamos a utilizar algunos ejemplos para comprender mejor su funcionamiento.

Cuando accedes a la portada de Jobeet, la URL es /job, por lo que la primera ruta cuyo patrón coincide con la URL es default_index. En los patrones, cuando una palabra empieza por dos puntos (:) se considera que es una variable, por lo que el patrón /:module significa: cualquier URL que sea una barra / seguida de cualquier contenido. En este ejemplo, la variable module tendrá como valor la palabra job. Después, este valor se puede obtener en la acción mediante $request->getParameter('module'). La ruta default_index también define un valor por defecto para la variable llamada action. Por tanto, cuando una URL cumple con el patrón de esta ruta, a la petición se le añade un parámetro llamado action que vale index.

Si ahora accedes a la página /job/show/id/1, Symfony detecta que el patrón que se cumple es el de la última ruta /:module/:action/*. En los patrones, un asterisco (*) es equivalente a una sucesión de pares clave/valor separados por barras (/). Por tanto, la URL /job/show/id/1 se intepreta de la siguiente forma:

Parámetro de la petición Valor
module job
action show
id 1

Nota Las variables llamadas module y action son especiales, ya que las emplea Symfony para determinar la acción que se ejecuta.

La URL /job/show/id/1 se puede crear en una plantilla mediante la siguiente llamada al helper url_for():

url_for('job/show?id='.$job->getId())

Si lo prefieres, puedes utilizar directamente el nombre de la ruta prefijándolo con el carácter @:

url_for('@default?module=job&action=show&id='.$job->getId())

Aunque las dos formas son equivalentes, la segunda es mucho más rápida porque Symfony no tiene que procesar todas las rutas para encontrar la ruta cuyo patrón cumple con la URL. Además, la segunda forma es mucho más flexible, ya que no depende del nombre de los módulos y de las acciones.