Hace unos días escribimos un post informativo sobre cómo configurar el Routing de Symfony2, sobre todo atendiendo a los cambios y novedades con respecto a las versiones 1.x del Framework Symfony (en las que tenemos más experiencia). El siguiente paso lógico sería entonces aprender cómo utilizar este nuevo y flamante sistema de Routing que nos hemos configurado en Symfony2 para crear links o hipervínculos entre las páginas de nuestro proyecto.
Por supuesto queremos utilizar el sistema de plantillas Twig porque estamos básicamente enamorados de su simpleza y potencia, y esto significa nos podemos ir olvidando de los helpers PHP como link_to que utilizábamos en versiones anteriores de Symfony para crear hipervínculos. Mirando la documentación oficial sobre las plantillas en Symfony2, vemos que en su lugar hemos de familiarizarnos con una serie de funciones Twig: path, url y asset.
La función path
La función path de Twig generará la URL del enlace, basándose en la configuración del Routing. Esta función toma como parámetro el nombre de la ruta y un array de todos los parámetros que ésta necesite y devuelve una URL relativa:
path( 'nombre_de_ruta', { 'nombre_de_param1': valor_de_param1, 'nombre_de_param2': valor_de_param2, ... } )
Atención, ya que puesto que la función path devuelve tan solo el path URL, en Symfony2 debemos incluir explícitamente la etiqueta HTML <a> que formará el enlace, y será en el atributo href donde irá el resultado de la función path.
Por ejemplo, supongamos que nos hemos definido la siguiente ruta para las páginas que contendrán los «productos» que mostramos en nuestra web:
mostrar_producto: pattern: /producto/{nombre} ...
En la sintaxis de Twig {{ y }} son delimitadores que se utilizan para hacer un output, por lo que generamos un enlace a la página de un producto en particular así:
<a href="{{ path( 'mostrar_producto', { 'nombre': producto.nombre_url } ) }}"> {{ producto.nombre }} </a>
La ventaja de este sistema es que si queremos modificar más adelante la URL de una página, tan sólo tenemos que cambiar la configuración del Routing, y todas nuestras plantillas generarán automáticamente la nueva URL. Por supuesto, la desventaja con la que nos encontraremos es que debemos utilizar constantemente los nombres de las rutas que hemos creado para generar enlaces. Nada nuevo si estamos acostumbrados al Framework Symfony en encarnaciones anteriores y a la necesidad de llevar un control exhaustivo de nuestras rutas, pero que puede ser una importante fuente de errores tontos si no vamos con cuidado.
La función url
Si queremos generar URLs absolutas, entonces tenemos que usar la función de Twig url, que por otro lado se utiliza de forma exactamente igual que la función path que hemos visto anteriormente.
<a href="{{ url('homepage') }}">Home</a>
La función asset
Es muy común también incluir en los templates enlaces a imágenes, JavaScripts, hojas de estilo, y otros archivos que en conjunto denominamos assets. Para esto se utiliza la función de Twig asset. Por supuesto podemos simplemente meter «a pelo» el path relativo hasta estos assets (por ejemplo /mi_app/imagenes/imagen.jpg) pero la función asset puede ser muy útil ya que nos abstrae de dónde se encuentra ubicada físicamente nuestra aplicación. Por ejemplo:
<img src="{{ asset('imagenes/imagen.jpg') }}" alt="Zelda!" />
El atributo src en este caso tomará el valor: /path_relativo_desde_root_hasta_mi_app/imagenes/imagen.jpg
Muy bien explicado, Muchas GRACIAS¡¡¡¡¡.
[…] La función path de Twig generará la URL del enlace, basándose en la configuración del Routing. Esta función toma como parámetro el nombre de la ruta y un array de todos los parámetros que ésta necesite y devuelve una URL relativa: ? […]
Hola qué tal?
Gracias por su buen articulo.
Tengo una duda, si utilizo su version:
{{ producto.nombre }}
qué es producto.nombre_url?
Gracias
como hago para ir a una sección específica de una pagina, lo que con html seria pagina – seccion1
por favor necesito saber si hay alguna manera de que le pueda pasar una variable a la funcion path ejemplo:
$var = update_quienes;
Editar
Es que necesito mandarle a mi controlador el nombre de la ruta y no veo ninguna funcion en Twig que me devuelva esto.
gracias de antemano