Skip to content

Commit 2585de3

Browse files
fix(validator): handle nested groups and group sequences
1 parent 7cc01a6 commit 2585de3

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

src/Symfony/Validator/Metadata/Property/ValidatorPropertyMetadataFactory.php

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -156,16 +156,16 @@ private function getValidationGroups(ValidatorClassMetadataInterface $classMetad
156156
{
157157
if (isset($options['validation_groups'])) {
158158
if ($options['validation_groups'] instanceof GroupSequence) {
159-
return $this->getGroupSequenceValidationGroups($options['validation_groups']);
159+
return $this->flattenValidationGroups($options['validation_groups']->groups);
160160
}
161161

162-
if (!\is_callable($options['validation_groups'])) {
163-
return $options['validation_groups'];
162+
if (\is_array($options['validation_groups']) && !\is_callable($options['validation_groups'])) {
163+
return $this->flattenValidationGroups($options['validation_groups']);
164164
}
165165
}
166166

167167
if ($classMetadata->hasGroupSequence()) {
168-
return $this->getGroupSequenceValidationGroups($classMetadata->getGroupSequence());
168+
return $this->flattenValidationGroups($classMetadata->getGroupSequence()->groups);
169169
}
170170

171171
if (!method_exists($classMetadata, 'getDefaultGroup')) {
@@ -176,22 +176,24 @@ private function getValidationGroups(ValidatorClassMetadataInterface $classMetad
176176
}
177177

178178
/**
179-
* @return array<string>
179+
* @param array<string|string[]|GroupSequence> $groups
180+
*
181+
* @return string[]
180182
*/
181-
private function getGroupSequenceValidationGroups(GroupSequence $groupSequence): array
183+
private function flattenValidationGroups(array $groups): array
182184
{
183-
$groups = [];
184-
foreach ($groupSequence->groups as $subGroup) {
185-
if (\is_array($subGroup)) {
186-
$groups[] = $subGroup;
187-
} elseif ($subGroup instanceof GroupSequence) {
188-
$groups[] = $this->getGroupSequenceValidationGroups($subGroup);
185+
$flattenGroups = [];
186+
foreach ($groups as $group) {
187+
if (\is_array($group)) {
188+
$flattenGroups[] = $this->flattenValidationGroups($group);
189+
} elseif ($group instanceof GroupSequence) {
190+
$flattenGroups[] = $this->flattenValidationGroups($group->groups);
189191
} else {
190-
$groups[] = [$subGroup];
192+
$flattenGroups[] = [$group];
191193
}
192194
}
193195

194-
return array_merge([], ...$groups);
196+
return array_merge([], ...$flattenGroups);
195197
}
196198

197199
/**

0 commit comments

Comments
 (0)