diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index a62ab004cf5a4..9a8dc780d6877 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -356,17 +356,16 @@ public function mergeConstraints(self $source) $constraint->addImplicitGroupName($this->getDefaultGroup()); } + $this->addPropertyMetadata($member); + if ($member instanceof MemberMetadata && !$member->isPrivate($this->name)) { $property = $member->getPropertyName(); - $this->members[$property] = [$member]; if ($member instanceof PropertyMetadata) { $this->properties[$property] = $member; } elseif ($member instanceof GetterMetadata) { $this->getters[$property] = $member; } - } else { - $this->addPropertyMetadata($member); } } } diff --git a/src/Symfony/Component/Validator/Tests/Fixtures/Annotation/EntityParent.php b/src/Symfony/Component/Validator/Tests/Fixtures/Annotation/EntityParent.php index 497100ef8b6b9..ddd18d08796db 100644 --- a/src/Symfony/Component/Validator/Tests/Fixtures/Annotation/EntityParent.php +++ b/src/Symfony/Component/Validator/Tests/Fixtures/Annotation/EntityParent.php @@ -20,6 +20,8 @@ class EntityParent implements EntityInterfaceA private $internal; private $data = 'Data'; private $child; + protected $address; + public $nickname; /** * @NotNull diff --git a/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php b/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php index df67a129f7006..a5a37c231dc4b 100644 --- a/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php +++ b/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php @@ -249,6 +249,70 @@ public function testMergeConstraintsKeepsPrivateMembersSeparate() $this->assertEquals($constraints, $members[1]->getConstraints()); } + public function testMergeConstraintsKeepsProtectedMembersSeparate() + { + $this->metadata->addPropertyConstraint('address', new ConstraintA()); + + $parent = new ClassMetadata(self::PARENTCLASS); + $parent->addPropertyConstraint('address', new ConstraintB()); + + $this->metadata->mergeConstraints($parent); + + $constraints = [ + new ConstraintA(['groups' => [ + 'Default', + 'Entity', + ]]), + ]; + $parentConstraints = [ + new ConstraintB(['groups' => [ + 'Default', + 'EntityParent', + 'Entity', + ]]), + ]; + + $members = $this->metadata->getPropertyMetadata('address'); + + $this->assertCount(2, $members); + $this->assertEquals(self::CLASSNAME, $members[0]->getClassName()); + $this->assertEquals($constraints, $members[0]->getConstraints()); + $this->assertEquals(self::PARENTCLASS, $members[1]->getClassName()); + $this->assertEquals($parentConstraints, $members[1]->getConstraints()); + } + + public function testMergeConstraintsKeepsPublicMembersSeparate() + { + $this->metadata->addPropertyConstraint('nickname', new ConstraintA()); + + $parent = new ClassMetadata(self::PARENTCLASS); + $parent->addPropertyConstraint('nickname', new ConstraintB()); + + $this->metadata->mergeConstraints($parent); + + $constraints = [ + new ConstraintA(['groups' => [ + 'Default', + 'Entity', + ]]), + ]; + $parentConstraints = [ + new ConstraintB(['groups' => [ + 'Default', + 'EntityParent', + 'Entity', + ]]), + ]; + + $members = $this->metadata->getPropertyMetadata('nickname'); + + $this->assertCount(2, $members); + $this->assertEquals(self::CLASSNAME, $members[0]->getClassName()); + $this->assertEquals($constraints, $members[0]->getConstraints()); + $this->assertEquals(self::PARENTCLASS, $members[1]->getClassName()); + $this->assertEquals($parentConstraints, $members[1]->getConstraints()); + } + public function testGetReflectionClass() { $reflClass = new \ReflectionClass(self::CLASSNAME);