Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 05b8978

Browse files
committed
[Validator] Fix regression with class metadatada on parent classes
1 parent 529973b commit 05b8978

File tree

6 files changed

+40
-33
lines changed

6 files changed

+40
-33
lines changed

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

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

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

363363
if ($member instanceof PropertyMetadata) {
364364
$this->properties[$property] = $member;
365365
} elseif ($member instanceof GetterMetadata) {
366366
$this->getters[$property] = $member;
367367
}
368-
} else {
369-
$this->addPropertyMetadata($member);
370368
}
371369
}
372370
}

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)