Symfony2.4: Novedades – Expression Language y Request Stack

La versión 2.4 introduce 2 novedades importantes, el nuevo componente Expression Language y el servicio Request Stack. El nuevo componente añade una gran flexibilidad a la hora de usar otros componentes en el framework.

Expression Language Component

Para saber más acerca de este componente hay un artículo en symfony.es con mucha información y también se puede consultar la documentación oficial. Aquí vamos a ver que novedades introduce, pero básicamente lo que nos permite este componente es evaluar o compilar expresiones de una línea que devuelven un valor. Podemos ver desde el caso más sencillo:

A cosas más complejas como:

Este componente nos permitirá introducir expresiones en la configuración.

Route conditions

Se ha añadido el parámetro condition cuando creamos una ruta, este parámetro nos permite introducir una expresión:

Para acceder a esta ruta el método HTTP tiene que ser GET o HEAD y la cabecera User-Agent debe contener “firefox”. Desde condition tenemos acceso a dos variables:

  • request: La petición, que será una instancia de Symfony\Component\HttpFoundation\Request 
  • context: Una instancia de Symfony\Component\Routing\RequestContext con información acerca de la ruta y la petición.

Security: Expression

Podemos usar también expresiones para controlar el acceso en un controlador:

Y si usamos SensioFrameworkExtraBundle tendremos acceso a la anotación Security donde podemos indicar expresiones:

En la documentación se pueden ver todas las variables y funciones a las que se tiene acceso en estas expresiones.

Si usamos el bundle que hemos comentado también podremos usar expresiones en la anotación Cache.

Security: allow_if

Este parámetro nos permite introducir expresiones en el control de acceso:

Twig: expression

Se ha añadido a Twig la función expression:

Servicios

Otro sitio donde podemos usar expresiones es a la hora de declarar servicios:

En los servicios tenemos acceso a las funciones service y parameter.

Constraint

Se ha añadido el constraint Expression:

Este constraint se puede usar a nivel de propiedad, en cuyo caso se tiene acceso a la variable value y también se puede usar a nivel de clase y ahí tenemos acceso a la variable this.

Request Stack service

Ya lo comentamos en las novedades de la versión 2.3, siempre han habido problemas con el servicio request. Se han ido añadiendo parches para manejar los servicios que dependían de la petición para inyectarle el servicio request.

El problema estaba en tratar a la petición como servicio cuando es simplemente un value object que contiene los datos de la petición. A partir de la versión 3.0 request dejará de ser un servicio y para obtener la petición se usará (se puede usar ya) el servicio RequestStack:

Por lo que a partir de la versión 2.4, se debe inyectar el servicio request_stack cuando estamos accediendo a la petición.

En el controlador podemos seguir accediendo de la misma forma si lo indicamos como parámetro del método:

En el siguiente artículo veremos las demás novedades de la versión 2.4.