Symfony2.3: Novedades – Forms y Validation

Justo hace unos días que salió la versión 2.4 y lo lógico sería ver las novedades de esa versión, pero antes hay que pasar por la 2.3. Hemos ido viendo las novedades de la versión 2.1 (parte 1 y 2) y de la 2.2 y ahora toca repasar las de la versión 2.3, que aunque lleve ya 6 meses, siempre hay cosas que se nos pasan por alto.

Ya se ha hablado mucho de que esta versión era la primera LTS y que una vez actualicemos a la 2.3, en teoría (y cierto en la versión 2.4), no tendremos problemas de seguir actualizando hasta la versión 3.0. Por lo que vamos a pasar a ver las novedades que se introdujeron en esta versión y empezaremos con las novedades que afectan a los formularios y la validación.

Los nuevos métodos handleRequest y submit

Hasta ahora cuando nos enviaba el usuario un formulario, la forma típica de asociar los datos que nos envían con el formulario era a través del método bind:

A partir de la versión 2.3 el método submit sustituye al método bind, pero en esta versión también se introduce el método handleRequest que es el que se debe usar, por lo tanto, esta es la forma recomendada a partir de la versión 2.3 de manejar los formularios que nos envían los clientes:

El método handleRequest internamente lo que hará será recoger los datos de la petición y llamar al método submit. Finalmente se comprueba que se ha enviado el formulario y que es válido. Comprobar que el formulario se ha enviado explícitamente con el método isSubmitted no es necesario porque el método isValid ya comprueba si se ha enviado, pero de esta forma queda más claro.

Soporte para botones en los formularios

A partir de esta versión se pueden añadir botones a la instancia del formulario sin tener que añadirlos a mano en el HTML.

Lo interesante aquí es que se pueden añadir varios botones y cuando nos envían el formulario podemos hacer una cosa u otra dependiendo del botón que se ha hecho click:

Además, como ya hemos visto alguna vez, los campos que se añaden a un formulario son también formularios. Los botones no son una excepción y se introducen los Types ButtonTypeSubmitType y ResetType. Al ser formularios, nos permiten usar las opciones comunes de los formularios y una de las interesantes es el atributo validation_groups. Como se comenta en la documentación, puede ser interesante para formularios wizard:

También hay que indicar que a partir de la versión 2.3 el valor del atributo validation_groups puede ser false. Antes se podía hacer lo mismo indicando un array vacío.

Los eventos PRE_SUBMIT, SUBMIT y POST_SUBMIT

En esta versión hay un cambio de nombre en los eventos del formulario, PRE_BIND ahora es PRE_SUBMIT, BIND es SUBMIT y POST_BIND ahora se llama POST_SUBMIT.

Nuevos helpers en Twig: form, form_start y form_end

Hasta ahora cuando mostrábamos un form usábamos la etiqueta <form> en HTML, ahora se puede imprimir el formulario directamente con form:

Y nos estaría imprimiendo todo el formulario, tag <form> incluido.

También podemos usar los helpers form_start y form_end:

Al ver esta forma de imprimir un formulario y sabiendo cómo se hacía en versiones anteriores te pueden surgir un par de dudas. ¿Qué pasa con los campos hidden? Antes usábamos (y se puede seguir usando) form_rest para esto, pero en este caso la etiqueta form_end llamará a form_rest si no se han imprimido antes.

Y la otra cuestión sería, ¿qué pasa con la acción, el método y si el formulario contiene archivos? Vamos a ver cómo configurar esto.

Por defecto el formulario será de tipo POST, la acción será la misma url en la que está y la etiqueta form_start se encargará de añadir el enctype si hace falta. Si lo queremos cambiar, se puede desde diferentes lugares, si construyes el formulario en el controlador (igual deberías plantearte moverlo a una clase) existen los métodos setMethod y setAction:

Si has creado una clase para el formulario se pueden indicar estos parámetros pasándolos en el array de opciones cuando creas el formulario, por ejemplo en el controller:

Finalmente, también se puede indicar estos parámetros en la vista:

Campo inherit_data

Esto simplemente es que el campo que antes llamábamos virtual ahora se llama también inherit_data.

Se permite usar empty_value con un formulario expanded

A partir de esta versión se puede usar en atributo empty_value cuando el formulario está marcado como expanded.

Validation

Collection: Las constraints Required y Optional han cambiado el namespace

Antes estas constraints estaban bajo el namespace Symfony\Component\Validator\Constraints\Collection y ahora se han movido donde están todas las contraints, en Symfony\Component\Validator\Constraints.

Si no las has usado antes, en la documentación aparece el siguiente ejemplo:

Esto significa que el campo personal_email es requerido, no puede estar vacío y tiene que ser un email. Por otra parte el campo alternate_email es opcional y también tiene que ser un email.

Currency

Como es de esperar, esta constraint comprueba que un valor es válido según la ISO 4217.

LessThan y LessThanOrEqual

Estas constraints se utilizan cuando queremos comprobar que un valor es menor o menor o igual a otro.

EqualTo y NotEqualTo

En este caso lo que se comprueba es que los valores sean iguales o distintos:

En este caso la comprobación será con dos iguales (==), un poco más abajo en el artículo veremos cómo hacerlo si se quiere que sean 3 iguales.

GreaterThan y GreaterThanOrEqual

GreaterThan comprueba que un valor es mayor que otro y GreaterThanOrEqual comprueba que es mayor o igual:

IdenticalTo y NotIdenticalTo

Estas constraints comprueba si dos valores son idénticos o no, usando el símbolo triple igual:

Con esto nos aseguramos que la edad es 20 y tiene que ser un entero.

Iban, Isbn y Issn

Estas constraints sirven para validar el IBAN (International Bank Account Number)ISBN (International Standard Book Number) e ISSN (International Standard Serial Number).

Y hasta aquí este artículo, en el próximo veremos el resto de novedades y luego veremos las de la versión 2.4. Ahora no dispongo del tiempo que me gustaría para dedicar al blog, pero poco a poco espero ir aumentándolo e ir escribiendo artículos más cortos.