Symfony 2.0, el libro oficial

11.3. Restricciones

El servicio validator está diseñado para validar objetos en base a restricciones o reglas (en inglés, constraints). Para validar un objeto, basta con asignar una o más restricciones a tu clase y luego pasarla al servicio validator.

Internamente, una restricción es un objeto PHP que asegura que se cumple una determinada condición. En la vida real, una restricción podría sencilla podría ser por ejemplo: "El pastel no se debe quemar". En Symfony2, las restricciones son similares: son aserciones de que una condición se cumple. Dado un valor, una restricción te dirá si el valor cumple las condiciones de tu restricción o no.

11.3.1. Restricciones predefinidas

Symfony2 incluye muchas de las restricciones más comunes en las aplicaciones web.

11.3.1.1. Restricciones básicas

11.3.1.2. Restricciones para cadenas de texto

11.3.1.3. Restricciones para números

11.3.1.4. Restricciones para fechas

11.3.1.5. Restricciones para colecciones

11.3.1.6. Restricciones para archivos

11.3.1.7. Otras restricciones

También puedes crear tus propias restricciones personalizadas.

11.3.2. Configurando las restricciones

Algunas restricciones, como NotBlank, son simples, mientras que otras, como la restricción Choice, tienen varias opciones de configuración disponibles. Supongamos que la clase Autor de los ejemplos anteriores tiene ahora otra propiedad, género que se puede configurar como male (masculino) o female (femenino):

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
    properties:
        gender:
            - Choice: { choices: [male, female], message: Choose a valid gender. }
// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;

class Autor
{
    /**
     * @Assert\Choice(
     *     choices = { "male", "female" },
     *     message = "Choose a valid gender."
     * )
     */
    public $gender;
}
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="Acme\BlogBundle\Entity\Author">
        <property name="gender">
            <constraint name="Choice">
                <option name="choices">
                    <value>male</value>
                    <value>female</value>
                </option>
                <option name="message">Choose a valid gender.</option>
            </constraint>
        </property>
    </class>
</constraint-mapping>
// src/Acme/BlogBundle/Entity/Author.php

// ...
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Choice;

class Autor
{
    public $gender;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('gender', new Choice(array(
            'choices' => array('male', 'female'),
            'message' => 'Choose a valid gender.',
        )));
    }
}

Las opciones de configuración de una restricción siempre se pueden pasar en forma de array. No obstante, algunas restricciones también te permiten pasar el valor de una opción predeterminada en vez del array. En el caso de la restricción Choice, las opciones se pueden especificar de esta manera:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
    properties:
        gender:
            - Choice: [male, female]
// src/Acme/BlogBundle/Entity/Author.php

// ...
use Symfony\Component\Validator\Constraints as Assert;

class Autor
{
    /**
     * @Assert\Choice({"male", "female"})
     */
    protected $gender;
}
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="Acme\BlogBundle\Entity\Author">
        <property name="gender">
            <constraint name="Choice">
                <value>male</value>
                <value>female</value>
            </constraint>
        </property>
    </class>
</constraint-mapping>
// src/Acme/BlogBundle/Entity/Author.php

// ...
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Choice;

class Autor
{
    protected $gender;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint(
            'gender',
            new Choice(array('male', 'female'))
        );
    }
}

Este comportamiento se ha pensado para hacer que la configuración de las opciones más comunes de una restricción sea más breve y rápida.

Si alguna vez dudas de cómo especificar una opción, puedes consultar la API de validación de Symfony2 o bien puedes ir a lo seguro y pasar siempre las opciones en un array (es decir, la primera forma que se explicó en la sección anterior).