Symfony2.1: Novedades – Parte 1

La versión 2.1 de Symfony lleva ya unos meses estable, de hecho la versión 2.2 ya está en fase de estabilización y ya ha salido la primera beta. En este artículo vamos a ver las novedades que se introdujeron en Symfony2.1 (buscando en la documentación actual), ya que muchos pasamos de la 2.0 a la 2.1 y en el documento de upgrade sólo habían cambios, pero no nos detuvimos en ver todo lo que había nuevo. El artículo lo dividiremos en 2 partes.

New Commands

config:dump-reference

Con este comando se puede obtener la configuración por defecto de un bundle, es muy útil ya que hay veces que no sabemos todo lo que se puede cambiar desde la configuración.

Vamos a ver la configuración del SensionFrameworkBundle (por tener una configuración pequeña), al comando hay que pasarle el nombre del bundle (SensionFrameworkBundle) o el alias (sensio_framework_extra):

router:match

Con este comando podemos comprobar qué ruta, si existe, corresponde un path:

twig:lint

Este comando sirve para comprobar errores de sintaxis en las plantillas Twig, puedes indicarle el nombre del fichero, un directorio o un nombre de bundle, he quitado un endblock para ver la salida:

Forms

Soporte para métodos “hasser”

Cuando hacemos algo así (lo importante es la parte del add):

El componente de formularios, comprueba que, a menos que enable sea un atributo público, tiene que tener un getter (getEnabled()) y un setter (setEnabled()), pero si el atributo es boolean comprueba si tiene isser (isEnabled()) o hasser (hasEnabled()).

Método bind más flexible

El método bind se usaba sólo con datos del cliente y ahora se usa también con las peticiones:

Por otra parte, el método bindRequest se ha marcado como deprecated.

validation_groups ahora admite un callback o Closure

Este es el ejemplo de la documentación:

Con esto podemos determinar que grupos de validación aplicar dinámicamente en base a los datos que contiene el form u otros parámetros.

Sintaxis alternativa en Twig para form_theme

Ahora acepta cualquier expresión de Twig válida, se puede usar un array para usar múltiples temas, cosa que antes no se podía.

La opción constraints acepta un constraint o un array de constraints

Antes estaba la opción validation_constraint, pero sólo aceptaba un constraint, ahora se puede hacer esto:

Se han añadido first_options y second_options al Type Repeated

Estas opciones permiten configurar cada uno de los campos que se muestran independientemente:

Estas configuraciones se juntarán con las de se configuren en options.

Se ha añadido la opción mapped

Con esta opción indicamos si el campo será ignorado al leer o escribir en el objeto. Antes se usaba property_path para esto, pero su uso para esta funcionalidad está deprecated, property_path se sigue usando para poder cambiar la propiedad a la que hace referencia un campo.

Security

Hay que tener configuradas las rutas para login_path, check_path y logout

Hay que tenerlas declaradas y configuradas en el security.yml

El método equals se ha borrado de UserInterface

Si necesitas sobrescribir la lógica de comparación, hay que implementar la interfaz EquatableInterface que tiene un método isEqualTo:

Templating

Se ha añadido soporte para hinclude.js

hinclude.js es una librería que permite embeber contenido asíncronamente, Symfony añade soporte a través de la etiqueta render:

Hay que añadir la librería hinclude.js para que funcione.

Translation

El parámetro default_locale está definido bajo al configuración de framework

Antes pertenecía a la sesión y ahora pertenece a request, por este motivo se ha movido:

Posibilidad de configurar el dominio de traducción para una plantilla Twig entera

Esto sólo afecta a la plantilla donde está la etiqueta, si se incluyen otras plantillas dentro de ésta no estarán en ese dominio a menos que esté explicito.

ClassLoader Component

Se ha añadido el método useIncludePath

Con este método intenta buscar la clase en el include_path como última opción.

Config Component

Se han añadido los métodos canBeEnabled y canBeDisabled

Estos métodos son shortcuts para indicar si una sección es opcional:

Routing Component

Añadida la posibilidad de configurar el host y scheme del contexto de la petición

A la hora de generar rutas desde consola, por ejemplo al enviar correos, hay que configurar el host porque el componente routing lo obtiene del contexto de la petición y el resultado es algo así:

Se puede configurar por cada comando o en la versión 2.1 se puede hacer de forma global:

Event Dispatcher Component

Se ha añadido la clase GenericEvent

Normalmente cuando trabajamos con eventos y creamos los nuestros propios suelen ser eventos que extienden de Event y que llevan sólo un objeto y sólo se usan para transportarlo, para esto se ha añadido la clase GenericEvent que tiene un atributo subject y además permite añadir argumentos.

El objeto Event tiene una referencia al dispatcher que lo ha lanzado

El EventDispatcher siempre inyecta una referencia a él mismo al objeto Event. Lo que significa que todos los listener tienen acceso al EventDispatcher que los ha lanzado a través del método getDispatcher(). Esto permite usos avanzados como indica la documentación.

El método EventDispatcher::dispatch() devuelve el evento

Cuando se llama al método dispatch devuelve el objeto que se lanza, esto permite hacer cosas como esta:

Añadido el nombre del evento al objeto Event

Cuando el EventDispatcher lanza un evento, el nombre del evento es inyectado en el propio objeto Event.

Filesystem Component

Se ha creado este nuevo componente que sirve dispone de utilidades básicas para el sistema de ficheros:

Finder Component

Se han añadido los métodos contains y notContains

Estos métodos permiten filtrar ficheros por su contenido

Se ha añadido el operador !=

Este operador permite por ejemplo:

Se ha añadido el método getContents

El método devuelve el contenido del fichero

HttpFoundation Component

Soporte para respuestas streaming

Lo vimos en un artículo anterior

Se ha añadido el método makeDisposition

Este método facilita la creación de las cabeceras necesarias cuando queremos que se descarguen un fichero (incluyendo los que el nombre tiene caracteres que no son ASCII):

Se ha añadido la clase JsonResponse

Lo vimos en un artículo anterior

Se ha añadido SessionInterface

Se pueden ver todos los cambios y los métodos de la interfaz en la documentación.

HttpKernel Component

Se ha añadido el evento kernel.terminate

Este evento se lanza después de enviar la respuesta al usuario y se puede usar por ejemplo para tareas “pesadas” como puede ser envío de emails, de esta forma le llegará rápidamente la respuesta al usuario.

Process Component

Se ha añadido la clase ProcessBuilder

Con esta clase hace que nuestro código funcione mejor en todas las plataformas.

Yaml Component

Se ha añadido el método Yaml::enablePhpParsing()

Antes de este método, el código PHP siempre se ejecutaba dentro del yaml cuando se ejecutaba el método parse, ahora por defecto no lo hace.