Skip to content

Commit 5676172

Browse files
committed
Merge pull request symfony#2647 from ClementGautier/2.0
[WIP] Added documentation for GroupSequence
2 parents 614700e + 5e2b161 commit 5676172

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

book/validation.rst

+126
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,9 @@ With this configuration, there are two validation groups:
771771

772772
* ``Default`` - contains the constraints not assigned to any other group;
773773

774+
* ``User`` - contains the constraints that belongs to group ``Default``
775+
(this group is usefull for :ref:`book-validation-group-sequence`);
776+
774777
* ``registration`` - contains the constraints on the ``email`` and ``password``
775778
fields only.
776779

@@ -779,13 +782,136 @@ as the second argument to the ``validate()`` method::
779782

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

785+
If no groups are specified, all constraints that belong in group ``Default``
786+
will be applied.
787+
782788
Of course, you'll usually work with validation indirectly through the form
783789
library. For information on how to use validation groups inside forms, see
784790
:ref:`book-forms-validation-groups`.
785791

786792
.. index::
787793
single: Validation; Validating raw values
788794

795+
.. _book-validation-group-sequence:
796+
797+
Group Sequence
798+
--------------
799+
800+
In some cases, you want to validate your groups by steps. To do this, you can
801+
use the ``GroupSequence`` feature. In the case an object defines a group sequence,
802+
the groups in the group sequence will be validated in order.
803+
804+
Group sequences cannot contain the group ``Default``, this would create a
805+
cycle, but need to contain the group ``{ClassName}`` instead.
806+
807+
For example, suppose you have a ``User`` class and want to validate that the
808+
username and the password are different only if all other validations passes
809+
(in order to avoid multiple error messages).
810+
811+
.. configuration-block::
812+
813+
.. code-block:: yaml
814+
815+
# src/Acme/BlogBundle/Resources/config/validation.yml
816+
Acme\BlogBundle\Entity\User:
817+
group_sequence:
818+
- User
819+
- Strict
820+
getters:
821+
passwordLegal:
822+
- "True":
823+
message: "The password cannot match your username"
824+
groups: [Strict]
825+
properties:
826+
username:
827+
- NotBlank: ~
828+
password:
829+
- NotBlank: ~
830+
831+
.. code-block:: php-annotations
832+
833+
// src/Acme/BlogBundle/Entity/User.php
834+
namespace Acme\BlogBundle\Entity;
835+
836+
use Symfony\Component\Security\Core\User\UserInterface;
837+
use Symfony\Component\Validator\Constraints as Assert;
838+
839+
/**
840+
* @Assert\GroupSequence({"Strict", "User"})
841+
*/
842+
class User implements UserInterface
843+
{
844+
/**
845+
* @Assert\NotBlank
846+
*/
847+
private $username;
848+
849+
/**
850+
* @Assert\NotBlank
851+
*/
852+
private $password;
853+
854+
/**
855+
* @Assert\True(message="The password cannot match your username", groups={"Strict"})
856+
*/
857+
public function isPasswordLegal()
858+
{
859+
return ($this->username !== $this->password);
860+
}
861+
}
862+
863+
.. code-block:: xml
864+
865+
<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
866+
<class name="Acme\BlogBundle\Entity\User">
867+
<property name="username">
868+
<constraint name="NotBlank" />
869+
</property>
870+
<property name="password">
871+
<constraint name="NotBlank" />
872+
</property>
873+
<getter property="passwordLegal">
874+
<constraint name="True">
875+
<option name="message">The password cannot match your username</option>
876+
<option name="groups">
877+
<value>Strict</value>
878+
</option>
879+
</constraint>
880+
</getter>
881+
<group-sequence>
882+
<value>User</value>
883+
<value>Strict</value>
884+
</group-sequence>
885+
</class>
886+
887+
.. code-block:: php
888+
889+
// src/Acme/BlogBundle/Entity/User.php
890+
namespace Acme\BlogBundle\Entity;
891+
892+
use Symfony\Component\Validator\Mapping\ClassMetadata;
893+
use Symfony\Component\Validator\Constraints as Assert;
894+
895+
class User
896+
{
897+
public static function loadValidatorMetadata(ClassMetadata $metadata)
898+
{
899+
$metadata->addPropertyConstraint('username', new Assert\NotBlank());
900+
$metadata->addPropertyConstraint('password', new Assert\NotBlank());
901+
902+
$metadata->addGetterConstraint('passwordLegal', new Assert\True(array(
903+
'message' => 'The password cannot match your first name',
904+
'groups' => array('Strict'),
905+
)));
906+
907+
$metadata->setGroupSequence(array('User', 'Strict'));
908+
}
909+
}
910+
911+
In this example, it will first validate all constraints in group ``User``
912+
(eg. ``Default``). Only if all constraints in that group are valid, the second
913+
group, ``Strict``, will be validated.
914+
789915
.. _book-validation-raw-values:
790916

791917
Validating Values and Arrays

0 commit comments

Comments
 (0)