From 8b281fe40120d9467bb1040909221daafa1a97f9 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Sun, 25 Dec 2016 18:58:48 +0100 Subject: [PATCH] override property constraints in child class --- .../Validator/Mapping/ClassMetadata.php | 4 +++ .../Tests/Mapping/ClassMetadataTest.php | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php index 5df8517a47..b18b788678 100644 --- a/src/Symfony/Component/Validator/Mapping/ClassMetadata.php +++ b/src/Symfony/Component/Validator/Mapping/ClassMetadata.php @@ -346,6 +346,10 @@ class ClassMetadata extends ElementMetadata implements ClassMetadataInterface } 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 34c62445a4..9538977167 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 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase { $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 }