diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index 5df8517a479a..b18b788678e5 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -346,6 +346,10 @@ public function mergeConstraints(ClassMetadata $source) } foreach ($source->getConstrainedProperties() as $property) { + if ($this->hasPropertyMetadata($property)) { + continue; + } + foreach ($source->getPropertyMetadata($property) as $member) { $member = clone $member; diff --git a/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php b/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php index 34c62445a428..953897716754 100644 --- a/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php +++ b/src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Validator\Tests\Mapping; use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\Constraints\GreaterThan; use Symfony\Component\Validator\Constraints\Valid; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Tests\Fixtures\ConstraintA; @@ -295,4 +296,29 @@ public function testGetPropertyMetadataReturnsEmptyArrayWithoutConfiguredMetadat { $this->assertCount(0, $this->metadata->getPropertyMetadata('foo'), '->getPropertyMetadata() returns an empty collection if no metadata is configured for the given property'); } + + public function testMergeDoesOverrideConstraintsFromParentClassIfPropertyIsOverriddenInChildClass() + { + $parentMetadata = new ClassMetadata('\Symfony\Component\Validator\Tests\Mapping\ParentClass'); + $parentMetadata->addPropertyConstraint('example', new GreaterThan(0)); + + $childMetadata = new ClassMetadata('\Symfony\Component\Validator\Tests\Mapping\ChildClass'); + $childMetadata->addPropertyConstraint('example', new GreaterThan(1)); + $childMetadata->mergeConstraints($parentMetadata); + + $expectedMetadata = new ClassMetadata('\Symfony\Component\Validator\Tests\Mapping\ChildClass'); + $expectedMetadata->addPropertyConstraint('example', new GreaterThan(1)); + + $this->assertEquals($expectedMetadata, $childMetadata); + } +} + +class ParentClass +{ + public $example = 0; +} + +class ChildClass extends ParentClass +{ + public $example = 1; // overrides parent property of same name }