Ver índice de contenidos del libro

11.6. Grupos de validación

Hasta ahora, hemos añadido restricciones a una clase y hemos comprobado si esa clase pasa todas las restricciones definidas o no. Sin embargo, en ocasiones es necesario validar que un objeto cumple únicamente algunas de las restricciones. Para ello, puedes organizar cada restricción en uno o más grupos de validación, y luego aplicar la validación contra un solo grupo de restricciones.

Supongamos por ejemplo que tienes una clase User que se utiliza tanto cuando un usuario se registra como cuando el usuario actualiza su información de contacto:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\User:
    properties:
        email:
            - Email: { groups: [registration] }
        password:
            - NotBlank: { groups: [registration] }
            - Length: { min: 7, groups: [registration] }
        city:
            - Length:
                min: 2
// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;
 
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
 
class User implements UserInterface
{
    /**
    * @Assert\Email(groups={"registration"})
    */
    private $email;
 
    /**
    * @Assert\NotBlank(groups={"registration"})
    * @Assert\Length(min=7, groups={"registration"})
    */
    private $password;
 
    /**
    * @Assert\Length(min = "2")
    */
    private $city;
}
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
<class name="Acme\BlogBundle\Entity\User">
    <property name="email">
        <constraint name="Email">
            <option name="groups">
                <value>registration</value>
            </option>
        </constraint>
    </property>
    <property name="password">
        <constraint name="NotBlank">
            <option name="groups">
                <value>registration</value>
            </option>
        </constraint>
        <constraint name="Length">
            <option name="min">7</option>
            <option name="groups">
                <value>registration</value>
            </option>
        </constraint>
    </property>
    <property name="city">
        <constraint name="Length">
            <option name="min">7</option>
        </constraint>
    </property>
</class>
// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;
 
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Length;
 
class User
{
    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('email', new Email(array(
            'groups' => array('registration'),
        )));
 
        $metadata->addPropertyConstraint('password', new NotBlank(array(
            'groups' => array('registration'),
        )));
        $metadata->addPropertyConstraint('password', new Length(array(
            'min'  => 7,
            'groups' => array('registration')
        )));
 
        $metadata->addPropertyConstraint(
            'city',
            Length(array("min" => 3)));
    }
}

Con esta configuración, hay dos grupos de validación:

  • Default, que contiene las restricciones no asignadas a ningún otro grupo.
  • registration, que contiene restricciones sólo en los campos de email y password.

Para decir al validador que use un grupo específico, pasa uno o más nombres de grupo como segundo argumento al método validate():

$errors = $validator->validate($author, array('registration'));

Si no se especifica ningún grupo, se aplican todas las restricciones definidas en el grupo Default.

Como casi siempre trabajas con la validación de forma indirecta al manejar los formularios, consulta el capítulo de los formularios para obtener más información sobre los grupos de validación.