Skip to content

Commit 464fda8

Browse files
bug #34694 [Validator] Fix auto-mapping constraints should not be validated (ogizanagi)
This PR was squashed before being merged into the 4.4 branch. Discussion ---------- [Validator] Fix auto-mapping constraints should not be validated | Q | A | ------------- | --- | Branch? | 4.4 <!-- see below --> | Bug fix? | yes | New feature? | no <!-- please update src/**/CHANGELOG.md files --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tickets | #34672 <!-- prefix each issue number with "Fix #", if any --> | License | MIT | Doc PR | N/A As for `Traverse`, I don't think we should add these "constraints" to the list. I'm also wondering if it really makes sense to have these annotations as constraints. I think it should rather behave like the `GroupSequence` annotation to add the info the generic metadata at loading time, but we don't need to rely on the constraints behavior at all. Commits ------- bc53e4bca0 [Validator] Fix auto-mapping constraints should not be validated
2 parents 31c3d72 + 8e60978 commit 464fda8

File tree

3 files changed

+22
-16
lines changed

3 files changed

+22
-16
lines changed

Tests/Validator/DoctrineLoaderTest.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121
use Symfony\Bridge\Doctrine\Tests\Fixtures\DoctrineLoaderParentEntity;
2222
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
2323
use Symfony\Bridge\Doctrine\Validator\DoctrineLoader;
24-
use Symfony\Component\Validator\Constraints\DisableAutoMapping;
2524
use Symfony\Component\Validator\Constraints\Length;
25+
use Symfony\Component\Validator\Mapping\AutoMappingStrategy;
2626
use Symfony\Component\Validator\Mapping\CascadingStrategy;
2727
use Symfony\Component\Validator\Mapping\ClassMetadata;
2828
use Symfony\Component\Validator\Mapping\Loader\AutoMappingTrait;
29+
use Symfony\Component\Validator\Mapping\PropertyMetadata;
2930
use Symfony\Component\Validator\Mapping\TraversalStrategy;
3031
use Symfony\Component\Validator\Tests\Fixtures\Entity;
3132
use Symfony\Component\Validator\Validation;
@@ -141,11 +142,12 @@ public function testLoadClassMetadata()
141142
$this->assertInstanceOf(Length::class, $textFieldConstraints[0]);
142143
$this->assertSame(1000, $textFieldConstraints[0]->max);
143144

145+
/** @var PropertyMetadata[] $noAutoMappingMetadata */
144146
$noAutoMappingMetadata = $classMetadata->getPropertyMetadata('noAutoMapping');
145147
$this->assertCount(1, $noAutoMappingMetadata);
146148
$noAutoMappingConstraints = $noAutoMappingMetadata[0]->getConstraints();
147-
$this->assertCount(1, $noAutoMappingConstraints);
148-
$this->assertInstanceOf(DisableAutoMapping::class, $noAutoMappingConstraints[0]);
149+
$this->assertCount(0, $noAutoMappingConstraints);
150+
$this->assertSame(AutoMappingStrategy::DISABLED, $noAutoMappingMetadata[0]->getAutoMappingStrategy());
149151
}
150152

151153
public function testFieldMappingsConfiguration()
@@ -207,13 +209,15 @@ public function testClassNoAutoMapping()
207209
$classMetadata = $validator->getMetadataFor(new DoctrineLoaderNoAutoMappingEntity());
208210

209211
$classConstraints = $classMetadata->getConstraints();
210-
$this->assertCount(1, $classConstraints);
211-
$this->assertInstanceOf(DisableAutoMapping::class, $classConstraints[0]);
212+
$this->assertCount(0, $classConstraints);
213+
$this->assertSame(AutoMappingStrategy::DISABLED, $classMetadata->getAutoMappingStrategy());
212214

213215
$maxLengthMetadata = $classMetadata->getPropertyMetadata('maxLength');
214216
$this->assertEmpty($maxLengthMetadata);
215217

218+
/** @var PropertyMetadata[] $autoMappingExplicitlyEnabledMetadata */
216219
$autoMappingExplicitlyEnabledMetadata = $classMetadata->getPropertyMetadata('autoMappingExplicitlyEnabled');
217-
$this->assertCount(2, $autoMappingExplicitlyEnabledMetadata[0]->constraints);
220+
$this->assertCount(1, $autoMappingExplicitlyEnabledMetadata[0]->constraints);
221+
$this->assertSame(AutoMappingStrategy::ENABLED, $autoMappingExplicitlyEnabledMetadata[0]->getAutoMappingStrategy());
218222
}
219223
}

Validator/DoctrineLoader.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
use Doctrine\ORM\Mapping\ClassMetadataInfo;
1717
use Doctrine\ORM\Mapping\MappingException as OrmMappingException;
1818
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
19-
use Symfony\Component\Validator\Constraints\DisableAutoMapping;
20-
use Symfony\Component\Validator\Constraints\EnableAutoMapping;
2119
use Symfony\Component\Validator\Constraints\Length;
2220
use Symfony\Component\Validator\Constraints\Valid;
21+
use Symfony\Component\Validator\Mapping\AutoMappingStrategy;
2322
use Symfony\Component\Validator\Mapping\ClassMetadata;
2423
use Symfony\Component\Validator\Mapping\Loader\AutoMappingTrait;
2524
use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
@@ -76,13 +75,16 @@ public function loadClassMetadata(ClassMetadata $metadata): bool
7675
$enabledForProperty = $enabledForClass;
7776
$lengthConstraint = null;
7877
foreach ($metadata->getPropertyMetadata($mapping['fieldName']) as $propertyMetadata) {
78+
// Enabling or disabling auto-mapping explicitly always takes precedence
79+
if (AutoMappingStrategy::DISABLED === $propertyMetadata->getAutoMappingStrategy()) {
80+
continue 2;
81+
}
82+
if (AutoMappingStrategy::ENABLED === $propertyMetadata->getAutoMappingStrategy()) {
83+
$enabledForProperty = true;
84+
}
85+
7986
foreach ($propertyMetadata->getConstraints() as $constraint) {
80-
// Enabling or disabling auto-mapping explicitly always takes precedence
81-
if ($constraint instanceof DisableAutoMapping) {
82-
continue 3;
83-
} elseif ($constraint instanceof EnableAutoMapping) {
84-
$enabledForProperty = true;
85-
} elseif ($constraint instanceof Length) {
87+
if ($constraint instanceof Length) {
8688
$lengthConstraint = $constraint;
8789
}
8890
}

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0",
3636
"symfony/security-core": "^4.4|^5.0",
3737
"symfony/expression-language": "^3.4|^4.0|^5.0",
38-
"symfony/validator": "^4.4|^5.0",
38+
"symfony/validator": "^4.4.1|^5.0.1",
3939
"symfony/var-dumper": "^3.4|^4.0|^5.0",
4040
"symfony/translation": "^3.4|^4.0|^5.0",
4141
"doctrine/annotations": "~1.7",
@@ -53,7 +53,7 @@
5353
"symfony/http-kernel": "<4.3.7",
5454
"symfony/messenger": "<4.3",
5555
"symfony/security-core": "<4.4",
56-
"symfony/validator": "<4.4"
56+
"symfony/validator": "<4.4.1|<5.0.1,>=5.0"
5757
},
5858
"suggest": {
5959
"symfony/form": "",

0 commit comments

Comments
 (0)