@@ -779,6 +779,9 @@ With this configuration, there are two validation groups:
779779
780780* ``Default `` - contains the constraints not assigned to any other group;
781781
782+ * ``User `` - contains the constraints that belongs to group ``Default ``
783+ (this group is useful for :ref: `book-validation-group-sequence `);
784+
782785* ``registration `` - contains the constraints on the ``email `` and ``password ``
783786 fields only.
784787
@@ -787,13 +790,138 @@ as the second argument to the ``validate()`` method::
787790
788791 $errors = $validator->validate($author, array('registration'));
789792
793+ If no groups are specified, all constraints that belong in group ``Default ``
794+ will be applied.
795+
790796Of course, you'll usually work with validation indirectly through the form
791797library. For information on how to use validation groups inside forms, see
792798:ref: `book-forms-validation-groups `.
793799
794800.. index ::
795801 single: Validation; Validating raw values
796802
803+ .. _book-validation-group-sequence :
804+
805+ Group Sequence
806+ --------------
807+
808+ In some cases, you want to validate your groups by steps. To do this, you can
809+ use the ``GroupSequence `` feature. In the case, an object defines a group sequence,
810+ and then the groups in the group sequence are validated in order.
811+
812+ .. tip ::
813+
814+ Group sequences cannot contain the group ``Default ``, as this would create
815+ a loop. Instead, use the group ``{ClassName} `` (e.g. ``User ``) instead.
816+
817+ For example, suppose you have a ``User `` class and want to validate that the
818+ username and the password are different only if all other validation passes
819+ (in order to avoid multiple error messages).
820+
821+ .. configuration-block ::
822+
823+ .. code-block :: yaml
824+
825+ # src/Acme/BlogBundle/Resources/config/validation.yml
826+ Acme\BlogBundle\Entity\User :
827+ group_sequence :
828+ - User
829+ - Strict
830+ getters :
831+ passwordLegal :
832+ - " True " :
833+ message : " The password cannot match your username"
834+ groups : [Strict]
835+ properties :
836+ username :
837+ - NotBlank : ~
838+ password :
839+ - NotBlank : ~
840+
841+ .. code-block :: php-annotations
842+
843+ // src/Acme/BlogBundle/Entity/User.php
844+ namespace Acme\BlogBundle\Entity;
845+
846+ use Symfony\Component\Security\Core\User\UserInterface;
847+ use Symfony\Component\Validator\Constraints as Assert;
848+
849+ /**
850+ * @Assert\GroupSequence({"Strict", "User"})
851+ */
852+ class User implements UserInterface
853+ {
854+ /**
855+ * @Assert\NotBlank
856+ */
857+ private $username;
858+
859+ /**
860+ * @Assert\NotBlank
861+ */
862+ private $password;
863+
864+ /**
865+ * @Assert\True(message="The password cannot match your username", groups={"Strict"})
866+ */
867+ public function isPasswordLegal()
868+ {
869+ return ($this->username !== $this->password);
870+ }
871+ }
872+
873+ .. code-block :: xml
874+
875+ <!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
876+ <class name =" Acme\BlogBundle\Entity\User" >
877+ <property name =" username" >
878+ <constraint name =" NotBlank" />
879+ </property >
880+ <property name =" password" >
881+ <constraint name =" NotBlank" />
882+ </property >
883+ <getter property =" passwordLegal" >
884+ <constraint name =" True" >
885+ <option name =" message" >The password cannot match your username</option >
886+ <option name =" groups" >
887+ <value >Strict</value >
888+ </option >
889+ </constraint >
890+ </getter >
891+ <group-sequence >
892+ <value >User</value >
893+ <value >Strict</value >
894+ </group-sequence >
895+ </class >
896+
897+ .. code-block :: php
898+
899+ // src/Acme/BlogBundle/Entity/User.php
900+ namespace Acme\BlogBundle\Entity;
901+
902+ use Symfony\Component\Validator\Mapping\ClassMetadata;
903+ use Symfony\Component\Validator\Constraints as Assert;
904+
905+ class User
906+ {
907+ public static function loadValidatorMetadata(ClassMetadata $metadata)
908+ {
909+ $metadata->addPropertyConstraint('username', new Assert\NotBlank());
910+ $metadata->addPropertyConstraint('password', new Assert\NotBlank());
911+
912+ $metadata->addGetterConstraint('passwordLegal', new Assert\True(array(
913+ 'message' => 'The password cannot match your first name',
914+ 'groups' => array('Strict'),
915+ )));
916+
917+ $metadata->setGroupSequence(array('User', 'Strict'));
918+ }
919+ }
920+
921+ In this example, it will first validate all constraints in the group ``User ``
922+ (which is the same as the ``Default `` group). Only if all constraints in
923+ that group are valid, the second group, ``Strict ``, will be validated.
924+
797925.. _book-validation-raw-values :
798926
799927Validating Values and Arrays
0 commit comments