Valid ===== This constraint is used to enable validation on objects that are embedded as properties on an object being validated. This allows you to validate an object and all sub-objects associated with it. ========== =================================================================== Applies to :ref:`property or method ` Options - `groups`_ - `payload`_ - `traverse`_ Class :class:`Symfony\\Component\\Validator\\Constraints\\Valid` ========== =================================================================== .. include:: /reference/forms/types/options/_error_bubbling_hint.rst.inc Basic Usage ----------- In the following example, create two classes ``Author`` and ``Address`` that both have constraints on their properties. Furthermore, ``Author`` stores an ``Address`` instance in the ``$address`` property:: // src/Entity/Address.php namespace App\Entity; class Address { protected $street; protected $zipCode; } .. code-block:: php // src/Entity/Author.php namespace App\Entity; class Author { protected $firstName; protected $lastName; protected $address; } .. configuration-block:: .. code-block:: php-annotations // src/Entity/Address.php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; class Address { /** * @Assert\NotBlank */ protected $street; /** * @Assert\NotBlank * @Assert\Length(max=5) */ protected $zipCode; } // src/Entity/Author.php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; class Author { /** * @Assert\NotBlank * @Assert\Length(min=4) */ protected $firstName; /** * @Assert\NotBlank */ protected $lastName; protected $address; } .. code-block:: yaml # config/validator/validation.yaml App\Entity\Address: properties: street: - NotBlank: ~ zipCode: - NotBlank: ~ - Length: max: 5 App\Entity\Author: properties: firstName: - NotBlank: ~ - Length: min: 4 lastName: - NotBlank: ~ .. code-block:: xml .. code-block:: php // src/Entity/Address.php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Mapping\ClassMetadata; class Address { public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('street', new Assert\NotBlank()); $metadata->addPropertyConstraint('zipCode', new Assert\NotBlank()); $metadata->addPropertyConstraint('zipCode', new Assert\Length(['max' => 5])); } } // src/Entity/Author.php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Mapping\ClassMetadata; class Author { public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('firstName', new Assert\NotBlank()); $metadata->addPropertyConstraint('firstName', new Assert\Length(['min' => 4])); $metadata->addPropertyConstraint('lastName', new Assert\NotBlank()); } } With this mapping, it is possible to successfully validate an author with an invalid address. To prevent that, add the ``Valid`` constraint to the ``$address`` property. .. configuration-block:: .. code-block:: php-annotations // src/Entity/Author.php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; class Author { /** * @Assert\Valid */ protected $address; } .. code-block:: yaml # config/validator/validation.yaml App\Entity\Author: properties: address: - Valid: ~ .. code-block:: xml .. code-block:: php // src/Entity/Author.php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Mapping\ClassMetadata; class Author { public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('address', new Assert\Valid()); } } If you validate an author with an invalid address now, you can see that the validation of the ``Address`` fields failed. .. code-block:: text App\Entity\Author.address.zipCode: This value is too long. It should have 5 characters or less. Options ------- .. include:: /reference/constraints/_groups-option.rst.inc .. include:: /reference/constraints/_payload-option.rst.inc traverse ~~~~~~~~ **type**: ``boolean`` **default**: ``true`` If this constraint is applied to a ``\Traversable``, then all containing values will be validated if this option is set to ``true``. This option is ignored on arrays: Arrays are traversed in either case. Keys are not validated.