El tutorial Jobeet

5.1. URLs

Si pinchas el enlace de cualquier oferta de trabajo de la portada de Jobeet, la URL de la página de detalle será algo como /job/show/id/1. Seguramente, si tienes experiencia programando sitios web con PHP, estás más acostumbrado a URL parecidas a /job.php?id=1. ¿Cómo funcionan las URL en Symfony? ¿Cómo sabe Symfony qué acción se tiene que ejecutar en base a esa URL? ¿Por qué se obtiene el id de la oferta de trabajo mediante $request->getParameter('id')? Hoy vamos a contestar a todas estas preguntas.

En primer lugar vamos a hablar de las URL y vamos a explicar exactamente en qué consisten. En el ámbito de la web, una URL es el identificador único de un recurso web. Cuando accedes a una URL, en realidad estás solicitando al navegador que obtenga el recurso identificado por esa URL.

Como la URL es la forma en la que el usuario interactúa con el sitio web, debe incluir toda la información necesaria para localizar el recurso al que hace referencia. Sin embargo, las URL tradicionales no describen el recurso, sino que directamente muestran la estructura interna de la aplicación. Al usuario no le importa si tu sitio está programado con PHP o si las ofertas de trabajo tienen un identificador en la base de datos.

Mostrar la estructura interna de la aplicación también es una mala idea desde el punto de vista de la seguridad. ¿Qué sucede si un usuario intenta adivinar la URL de recursos para los que no tiene permiso de acceso? Obviamente el programador habrá restringido su acceso, pero siempre es mejor ocultar este tipo de información delicada.

Las URL son tan importantes dentro de Symfony que tienen todo un sub-framework dedicado a trabajar con las URL: el sistema de enrutamiento. Este sub-framework gestiona las URI internas y las URL externas. Cuando la aplicación recibe una petición, el sistema de enrutamiento procesa la URL y la convierte en una URI interna.

En las lecciones anteriores ya se ha visto la URI interna de la página de detalle de una oferta de trabajo en la plantilla showSuccess.php:

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

El helper url_for() se encarga de convertir esta URI interna en una URL correcta:

/job/show/id/1

Las URI internas se componen de varias partes:

  • job es el nombre del módulo.
  • show es el nombre de la acción
  • El resto es la query string, que define los parámetros que se pasan a la acción

Por tanto, el patrón genérico de las URI internas es:

nombre_de_modulo/nombre_de_accion?clave1=valor1&clave2=valor2&...

Como el sistema de enrutamiento de Symfony es bidireccional, puedes modificar las URL sin modificar el funcionamiento interno de la aplicación. Esta es una de las ventajas principales del patrón de diseño del controlador frontal.