Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e98f5f2

Browse filesBrowse files
rmikalkenasnicolas-grekas
authored andcommitted
[Validator] Fix regression with class metadatada on parent classes
1 parent 529973b commit e98f5f2
Copy full SHA for e98f5f2

File tree

7 files changed

+43
-34
lines changed
Filter options

7 files changed

+43
-34
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php
+1-1Lines 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']) && (!$doctrineMetadata->isMappedSuperclass || $metadata->getReflectionClass()->getProperty($mapping['fieldName'])->isPrivate())) {
112112
$metadata->addPropertyConstraint($mapping['fieldName'], new Length(['max' => $mapping['length']]));
113113
$loaded = true;
114114
}

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Mapping/ClassMetadata.php
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,11 +358,11 @@ public function mergeConstraints(self $source)
358358

359359
if ($member instanceof MemberMetadata && !$member->isPrivate($this->name)) {
360360
$property = $member->getPropertyName();
361-
$this->members[$property] = [$member];
361+
$this->members[$property][] = $member;
362362

363-
if ($member instanceof PropertyMetadata) {
363+
if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) {
364364
$this->properties[$property] = $member;
365-
} elseif ($member instanceof GetterMetadata) {
365+
} elseif ($member instanceof GetterMetadata && !isset($this->getters[$property])) {
366366
$this->getters[$property] = $member;
367367
}
368368
} else {

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Tests/Fixtures/Annotation/Entity.php
+4Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Tests/Fixtures/Attribute/Entity.php
+2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Tests/Fixtures/NestedAttribute/Entity.php
+2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php
+21-27Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php
+10-3Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.