diff --git a/src/Symfony/Component/Validator/CHANGELOG.md b/src/Symfony/Component/Validator/CHANGELOG.md index fc974c5a185a9..e953159c10137 100644 --- a/src/Symfony/Component/Validator/CHANGELOG.md +++ b/src/Symfony/Component/Validator/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.4 +--- + + * Add the special group name `*` which can be passed to `ValidatorInterface::validate()` to validate all constraints, regardless of their group. + 6.3 --- diff --git a/src/Symfony/Component/Validator/Mapping/GenericMetadata.php b/src/Symfony/Component/Validator/Mapping/GenericMetadata.php index f05e402609d5d..c59aad824d042 100644 --- a/src/Symfony/Component/Validator/Mapping/GenericMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/GenericMetadata.php @@ -204,6 +204,15 @@ public function hasConstraints(): bool */ public function findConstraints(string $group): array { + if ('*' === $group) { + $constraints = []; + foreach ($this->constraintsByGroup as $groupConstraints) { + $constraints = array_merge($constraints, $groupConstraints); + } + + return $constraints; + } + return $this->constraintsByGroup[$group] ?? []; } diff --git a/src/Symfony/Component/Validator/Tests/Validator/RecursiveValidatorTest.php b/src/Symfony/Component/Validator/Tests/Validator/RecursiveValidatorTest.php index 010536e661f19..a1d3efe77ad85 100644 --- a/src/Symfony/Component/Validator/Tests/Validator/RecursiveValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Validator/RecursiveValidatorTest.php @@ -1114,6 +1114,32 @@ public function testValidateMultipleGroups() $this->assertCount(2, $violations); } + public function testValidateAllGroups() + { + $entity = new Entity(); + + $callback = function ($value, ExecutionContextInterface $context) { + $context->addViolation('Message'); + }; + + $this->metadata->addConstraint(new Callback([ + 'callback' => $callback, + 'groups' => 'Group 1', + ])); + $this->metadata->addConstraint(new Callback([ + 'callback' => $callback, + 'groups' => 'Group 2', + ])); + $this->metadata->addConstraint(new Callback([ + 'callback' => $callback, + ])); + + $violations = $this->validate($entity, null, '*'); + + /* @var ConstraintViolationInterface[] $violations */ + $this->assertCount(3, $violations); + } + public function testReplaceDefaultGroupByGroupSequenceObject() { $entity = new Entity();