Skip to content

Commit 2ba0f57

Browse files
rmikalkenasnicolas-grekas
authored andcommitted
[Validator] Fix regression with class metadatada on parent classes
1 parent 529973b commit 2ba0f57

File tree

8 files changed

+46
-38
lines changed

8 files changed

+46
-38
lines changed

src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public function loadClassMetadata(ClassMetadata $metadata): bool
108108
if (isset($mapping['originalClass']) && !str_contains($mapping['declaredField'], '.')) {
109109
$metadata->addPropertyConstraint($mapping['declaredField'], new Valid());
110110
$loaded = true;
111-
} elseif (property_exists($className, $mapping['fieldName'])) {
111+
} elseif (property_exists($className, $mapping['fieldName']) && $className === $metadata->getReflectionClass()->getProperty($mapping['fieldName'])->class) {
112112
$metadata->addPropertyConstraint($mapping['fieldName'], new Length(['max' => $mapping['length']]));
113113
$loaded = true;
114114
}

src/Symfony/Bridge/Doctrine/composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"symfony/security-core": "^5.3|^6.0",
4141
"symfony/expression-language": "^4.4|^5.0|^6.0",
4242
"symfony/uid": "^5.1|^6.0",
43-
"symfony/validator": "^5.4.25|~6.2.12|^6.3.1",
43+
"symfony/validator": "^5.2|^6.0",
4444
"symfony/translation": "^4.4|^5.0|^6.0",
4545
"symfony/var-dumper": "^4.4|^5.0|^6.0",
4646
"doctrine/annotations": "^1.10.4|^2",
@@ -63,7 +63,7 @@
6363
"symfony/proxy-manager-bridge": "<4.4.19",
6464
"symfony/security-bundle": "<5",
6565
"symfony/security-core": "<5.3",
66-
"symfony/validator": "<5.4.25|>=6,<6.2.12|>=6.3,<6.3.1"
66+
"symfony/validator": "<5.2"
6767
},
6868
"suggest": {
6969
"symfony/form": "",

src/Symfony/Component/Validator/Mapping/ClassMetadata.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,17 +356,16 @@ public function mergeConstraints(self $source)
356356
$constraint->addImplicitGroupName($this->getDefaultGroup());
357357
}
358358

359+
$this->addPropertyMetadata($member);
360+
359361
if ($member instanceof MemberMetadata && !$member->isPrivate($this->name)) {
360362
$property = $member->getPropertyName();
361-
$this->members[$property] = [$member];
362363

363-
if ($member instanceof PropertyMetadata) {
364+
if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) {
364365
$this->properties[$property] = $member;
365-
} elseif ($member instanceof GetterMetadata) {
366+
} elseif ($member instanceof GetterMetadata && !isset($this->getters[$property])) {
366367
$this->getters[$property] = $member;
367368
}
368-
} else {
369-
$this->addPropertyMetadata($member);
370369
}
371370
}
372371
}

src/Symfony/Component/Validator/Tests/Fixtures/Annotation/Entity.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ class Entity extends EntityParent implements EntityInterfaceB
5555
private $internal;
5656
public $data = 'Overridden data';
5757
public $initialized = false;
58+
/**
59+
* @Assert\Type("integer")
60+
*/
61+
protected $other;
5862

5963
public function __construct($internal = null)
6064
{

src/Symfony/Component/Validator/Tests/Fixtures/Attribute/Entity.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class Entity extends EntityParent implements EntityInterfaceB
5757
private $internal;
5858
public $data = 'Overridden data';
5959
public $initialized = false;
60+
#[Assert\Type('integer')]
61+
protected $other;
6062

6163
public function __construct($internal = null)
6264
{

src/Symfony/Component/Validator/Tests/Fixtures/NestedAttribute/Entity.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class Entity extends EntityParent implements EntityInterfaceB
7878
private $internal;
7979
public $data = 'Overridden data';
8080
public $initialized = false;
81+
#[Assert\Type('integer')]
82+
protected $other;
8183

8284
public function __construct($internal = null)
8385
{

src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ public function testMergeConstraintsMergesMemberConstraints()
163163
$parent->addPropertyConstraint('firstName', new ConstraintA());
164164
$parent->addPropertyConstraint('firstName', new ConstraintB(['groups' => 'foo']));
165165

166-
$this->metadata->mergeConstraints($parent);
167166
$this->metadata->addPropertyConstraint('firstName', new ConstraintA());
167+
$this->metadata->mergeConstraints($parent);
168168

169169
$constraintA1 = new ConstraintA(['groups' => [
170170
'Default',
@@ -179,35 +179,29 @@ public function testMergeConstraintsMergesMemberConstraints()
179179
'groups' => ['foo'],
180180
]);
181181

182-
$constraints = [
183-
$constraintA1,
184-
$constraintB,
185-
$constraintA2,
186-
];
182+
$members = $this->metadata->getPropertyMetadata('firstName');
187183

188-
$constraintsByGroup = [
189-
'Default' => [
190-
$constraintA1,
191-
$constraintA2,
192-
],
193-
'EntityParent' => [
194-
$constraintA1,
195-
],
196-
'Entity' => [
197-
$constraintA1,
198-
$constraintA2,
184+
$this->assertCount(2, $members);
185+
$this->assertEquals(self::CLASSNAME, $members[0]->getClassName());
186+
$this->assertEquals([$constraintA2], $members[0]->getConstraints());
187+
$this->assertEquals(
188+
[
189+
'Default' => [$constraintA2],
190+
'Entity' => [$constraintA2],
199191
],
200-
'foo' => [
201-
$constraintB,
192+
$members[0]->constraintsByGroup
193+
);
194+
$this->assertEquals(self::PARENTCLASS, $members[1]->getClassName());
195+
$this->assertEquals([$constraintA1, $constraintB], $members[1]->getConstraints());
196+
$this->assertEquals(
197+
[
198+
'Default' => [$constraintA1],
199+
'Entity' => [$constraintA1],
200+
'EntityParent' => [$constraintA1],
201+
'foo' => [$constraintB],
202202
],
203-
];
204-
205-
$members = $this->metadata->getPropertyMetadata('firstName');
206-
207-
$this->assertCount(1, $members);
208-
$this->assertEquals(self::PARENTCLASS, $members[0]->getClassName());
209-
$this->assertEquals($constraints, $members[0]->getConstraints());
210-
$this->assertEquals($constraintsByGroup, $members[0]->constraintsByGroup);
203+
$members[1]->constraintsByGroup
204+
);
211205
}
212206

213207
public function testMemberMetadatas()

src/Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Symfony\Component\Validator\Constraints\Range;
2828
use Symfony\Component\Validator\Constraints\Required;
2929
use Symfony\Component\Validator\Constraints\Sequentially;
30+
use Symfony\Component\Validator\Constraints\Type;
3031
use Symfony\Component\Validator\Constraints\Valid;
3132
use Symfony\Component\Validator\Mapping\ClassMetadata;
3233
use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
@@ -98,6 +99,7 @@ public function testLoadClassMetadata(string $namespace)
9899
$expected->addGetterConstraint('lastName', new NotNull());
99100
$expected->addGetterMethodConstraint('valid', 'isValid', new IsTrue());
100101
$expected->addGetterConstraint('permissions', new IsTrue());
102+
$expected->addPropertyConstraint('other', new Type('integer'));
101103

102104
// load reflection class so that the comparison passes
103105
$expected->getReflectionClass();
@@ -139,18 +141,16 @@ public function testLoadClassMetadataAndMerge(string $namespace)
139141
$loader->loadClassMetadata($parent_metadata);
140142

141143
$metadata = new ClassMetadata($namespace.'\Entity');
144+
$loader->loadClassMetadata($metadata);
142145

143146
// Merge parent metaData.
144147
$metadata->mergeConstraints($parent_metadata);
145148

146-
$loader->loadClassMetadata($metadata);
147-
148149
$expected_parent = new ClassMetadata($namespace.'\EntityParent');
149150
$expected_parent->addPropertyConstraint('other', new NotNull());
150151
$expected_parent->getReflectionClass();
151152

152153
$expected = new ClassMetadata($namespace.'\Entity');
153-
$expected->mergeConstraints($expected_parent);
154154

155155
$expected->setGroupSequence(['Foo', 'Entity']);
156156
$expected->addConstraint(new ConstraintA());
@@ -187,11 +187,18 @@ public function testLoadClassMetadataAndMerge(string $namespace)
187187
$expected->addGetterConstraint('lastName', new NotNull());
188188
$expected->addGetterMethodConstraint('valid', 'isValid', new IsTrue());
189189
$expected->addGetterConstraint('permissions', new IsTrue());
190+
$expected->addPropertyConstraint('other', new Type('integer'));
190191

191192
// load reflection class so that the comparison passes
192193
$expected->getReflectionClass();
194+
$expected->mergeConstraints($expected_parent);
193195

194196
$this->assertEquals($expected, $metadata);
197+
198+
$otherMetadata = $metadata->getPropertyMetadata('other');
199+
$this->assertCount(2, $otherMetadata);
200+
$this->assertInstanceOf(Type::class, $otherMetadata[0]->getConstraints()[0]);
201+
$this->assertInstanceOf(NotNull::class, $otherMetadata[1]->getConstraints()[0]);
195202
}
196203

197204
/**

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy