En la sección anterior, aprendiste cómo se envían los formularios con datos válidos o inválidos. En Symfony2, la validación se aplica sobre el objeto que está manejando el formulario (en este caso, el objeto de tipo Task
). En otras palabras, no importa si el formulario es válido o no, lo que importa es que el objeto $task
contenga información válida. El método $form->isValid()
en realidad es un atajo que pregunta al objeto $task
si tiene datos válidos o no.
La validación se realiza añadiendo un conjunto de reglas (llamadas constraints) a una clase. Como ejemplo, añade restricciones de validación para que el campo task
no pueda estar vacío y para que el campo dueDate
no pueda estar vacío y deba ser un objeto DateTime
válido.
# Acme/TaskBundle/Resources/config/validation.yml
Acme\TaskBundle\Entity\Task:
properties:
task:
- NotBlank: ~
dueDate:
- NotBlank: ~
- Type: \DateTime
// Acme/TaskBundle/Entity/Task.php
use Symfony\Component\Validator\Constraints as Assert;
class Task
{
/**
* @Assert\NotBlank()
*/
public $task;
/**
* @Assert\NotBlank()
* @Assert\Type("\DateTime")
*/
protected $dueDate;
}
<!-- Acme/TaskBundle/Resources/config/validation.xml -->
<class name="Acme\TaskBundle\Entity\Task">
<property name="task">
<constraint name="NotBlank" />
</property>
<property name="dueDate">
<constraint name="NotBlank" />
<constraint name="Type">\DateTime</constraint>
</property>
</class>
// Acme/TaskBundle/Entity/Task.php
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Type;
class Task
{
// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('task', new NotBlank());
$metadata->addPropertyConstraint('dueDate', new NotBlank());
$metadata->addPropertyConstraint('dueDate', new Type('\DateTime'));
}
}
¡Y ya está! Si ahora vuelves a enviar el formulario con datos no válidos, verás los correspondientes errores de validación en el formulario.
La validación es una característica muy poderosa de Symfony2 y tiene su propio capítulo.
12.2.1. Grupos de validación
Truco Si no utilizas grupos en la validación de tus entidades y objetos, puedes saltarte esta sección.
Si tu objeto utiliza la validación de grupos, tendrás que especificar qué grupo debe utilizar el formulario para validar la información:
$form = $this->createFormBuilder($users, array(
'validation_groups' => array('registration'),
))->add(...);
Si además utilizas clases para definir los formularios (una buena práctica recomendada que se explica más adelante) entonces tendrás que agregar lo siguiente al método getDefaultOptions()
:
public function getDefaultOptions(array $options)
{
return array(
'validation_groups' => array('registration'),
);
}
En ambos casos, sólo se utilizará el grupo de validación registration
para validar el objeto manejado por el formulario.