Symfony 2.0, el libro oficial

12.2. Validando formularios

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.