Symfony 2.1, el libro oficial

11.7. Secuencias de grupos de validación

En ocasiones puede resultar útil aplicar los grupos de validación paso a paso. Para ello, utiliza la opción GroupSequence. En el siguiente ejemplo, el objeto define una secuencia de grupos de validación, por lo que esos grupos se validan en el mismo orden en el que se han definido.

Truco Las secuencias no pueden contener al grupo Default, ya que si no, se crearía un bucle, pero sí que deben contener al menos un grupo con el mismo nombre que la clase.

Imagina que dispones de una clase llamada User y quieres validar que el nombre de usuario y la contraseña sean diferentes, pero solamente cuando todas las demás validaciones se hayan completado con éxito (para evitar mostrar demasiados mensajes de error).

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\User:
    group_sequence:
        - User
        - Strict
    getters:
        passwordLegal:
            - "True":
                message: "La contraseña no puede ser igual que tu nombre de usuario"
                groups: [Strict]
    properties:
        username:
            - NotBlank: ~
        password:
            - NotBlank: ~
// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @Assert\GroupSequence({"Strict", "User"})
 */
class User implements UserInterface
{
    /**
    * @Assert\NotBlank
    */
    private $username;

    /**
    * @Assert\NotBlank
    */
    private $password;

    /**
     * @Assert\True(message="La contraseña no puede ser igual que tu nombre de usuario", groups={"Strict"})
     */
    public function isPasswordLegal()
    {
        return ($this->username !== $this->password);
    }
}
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
<class name="Acme\BlogBundle\Entity\User">
    <property name="username">
        <constraint name="NotBlank" />
    </property>
    <property name="password">
        <constraint name="NotBlank" />
    </property>
    <getter property="passwordLegal">
        <constraint name="True">
            <option name="message">La contraseña no puede ser igual que tu nombre de usuario</option>
            <option name="groups">
                <value>Strict</value>
            </option>
        </constraint>
    </getter>
    <group-sequence>
        <value>User</value>
        <value>Strict</value>
    </group-sequence>
</class>
// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;

class User
{
    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('username', new Assert\NotBlank());
        $metadata->addPropertyConstraint('password', new Assert\NotBlank());

        $metadata->addGetterConstraint('passwordLegal', new Assert\True(array(
            'message' => 'La contraseña no puede ser igual que tu nombre de usuario',
            'groups'  => array('Strict'),
        )));

        $metadata->setGroupSequence(array('User', 'Strict'));
    }
}

En este ejemplo, primero se validan todas las restricciones del grupo User (que es el mismo que el grupo Default). Si todas esas restricciones pasan correctamente, entonces se aplica el grupo de validación Strict.