From 281861e788865dcecf66e904adf62bda55e01902 Mon Sep 17 00:00:00 2001 From: Ben Davies Date: Wed, 29 Apr 2020 21:31:19 +0100 Subject: [PATCH] [Validator] fix lazy property usage. --- .../Validator/Tests/Fixtures/Entity.php | 10 ++++ .../Tests/Validator/AbstractValidatorTest.php | 55 ++++++++++++++----- .../RecursiveContextualValidator.php | 4 ++ 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/Symfony/Component/Validator/Tests/Fixtures/Entity.php b/src/Symfony/Component/Validator/Tests/Fixtures/Entity.php index 16ba8a718ec5..673e62bae7d4 100644 --- a/src/Symfony/Component/Validator/Tests/Fixtures/Entity.php +++ b/src/Symfony/Component/Validator/Tests/Fixtures/Entity.php @@ -53,6 +53,11 @@ public function __construct($internal = null) $this->internal = $internal; } + public function getFirstName() + { + return $this->firstName; + } + public function getInternal() { return $this->internal.' from getter'; @@ -141,4 +146,9 @@ public function setChildB($childB) { $this->childB = $childB; } + + public function getReference() + { + return $this->reference; + } } diff --git a/src/Symfony/Component/Validator/Tests/Validator/AbstractValidatorTest.php b/src/Symfony/Component/Validator/Tests/Validator/AbstractValidatorTest.php index 07e45f47eb2c..8482a71a385d 100644 --- a/src/Symfony/Component/Validator/Tests/Validator/AbstractValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Validator/AbstractValidatorTest.php @@ -32,6 +32,8 @@ abstract class AbstractValidatorTest extends TestCase const REFERENCE_CLASS = 'Symfony\Component\Validator\Tests\Fixtures\Reference'; + const LAZY_PROPERTY = 'Symfony\Component\Validator\Validator\LazyProperty'; + /** * @var FakeMetadataFactory */ @@ -54,6 +56,7 @@ protected function setUp() $this->referenceMetadata = new ClassMetadata(self::REFERENCE_CLASS); $this->metadataFactory->addMetadata($this->metadata); $this->metadataFactory->addMetadata($this->referenceMetadata); + $this->metadataFactory->addMetadata(new ClassMetadata(self::LAZY_PROPERTY)); } protected function tearDown() @@ -510,7 +513,10 @@ public function testFailOnScalarReferences() $this->validate($entity); } - public function testArrayReference() + /** + * @dataProvider getConstraintMethods + */ + public function testArrayReference($constraintMethod) { $entity = new Entity(); $entity->reference = ['key' => new Reference()]; @@ -528,7 +534,7 @@ public function testArrayReference() $context->addViolation('Message %param%', ['%param%' => 'value']); }; - $this->metadata->addPropertyConstraint('reference', new Valid()); + $this->metadata->$constraintMethod('reference', new Valid()); $this->referenceMetadata->addConstraint(new Callback([ 'callback' => $callback, 'groups' => 'Group', @@ -548,8 +554,10 @@ public function testArrayReference() $this->assertNull($violations[0]->getCode()); } - // https://github.com/symfony/symfony/issues/6246 - public function testRecursiveArrayReference() + /** + * @dataProvider getConstraintMethods + */ + public function testRecursiveArrayReference($constraintMethod) { $entity = new Entity(); $entity->reference = [2 => ['key' => new Reference()]]; @@ -567,7 +575,7 @@ public function testRecursiveArrayReference() $context->addViolation('Message %param%', ['%param%' => 'value']); }; - $this->metadata->addPropertyConstraint('reference', new Valid()); + $this->metadata->$constraintMethod('reference', new Valid()); $this->referenceMetadata->addConstraint(new Callback([ 'callback' => $callback, 'groups' => 'Group', @@ -611,7 +619,10 @@ public function testOnlyCascadedArraysAreTraversed() $this->assertCount(0, $violations); } - public function testArrayTraversalCannotBeDisabled() + /** + * @dataProvider getConstraintMethods + */ + public function testArrayTraversalCannotBeDisabled($constraintMethod) { $entity = new Entity(); $entity->reference = ['key' => new Reference()]; @@ -620,7 +631,7 @@ public function testArrayTraversalCannotBeDisabled() $context->addViolation('Message %param%', ['%param%' => 'value']); }; - $this->metadata->addPropertyConstraint('reference', new Valid([ + $this->metadata->$constraintMethod('reference', new Valid([ 'traverse' => false, ])); $this->referenceMetadata->addConstraint(new Callback($callback)); @@ -631,7 +642,10 @@ public function testArrayTraversalCannotBeDisabled() $this->assertCount(1, $violations); } - public function testRecursiveArrayTraversalCannotBeDisabled() + /** + * @dataProvider getConstraintMethods + */ + public function testRecursiveArrayTraversalCannotBeDisabled($constraintMethod) { $entity = new Entity(); $entity->reference = [2 => ['key' => new Reference()]]; @@ -640,9 +654,10 @@ public function testRecursiveArrayTraversalCannotBeDisabled() $context->addViolation('Message %param%', ['%param%' => 'value']); }; - $this->metadata->addPropertyConstraint('reference', new Valid([ + $this->metadata->$constraintMethod('reference', new Valid([ 'traverse' => false, ])); + $this->referenceMetadata->addConstraint(new Callback($callback)); $violations = $this->validate($entity); @@ -651,12 +666,15 @@ public function testRecursiveArrayTraversalCannotBeDisabled() $this->assertCount(1, $violations); } - public function testIgnoreScalarsDuringArrayTraversal() + /** + * @dataProvider getConstraintMethods + */ + public function testIgnoreScalarsDuringArrayTraversal($constraintMethod) { $entity = new Entity(); $entity->reference = ['string', 1234]; - $this->metadata->addPropertyConstraint('reference', new Valid()); + $this->metadata->$constraintMethod('reference', new Valid()); $violations = $this->validate($entity); @@ -664,12 +682,15 @@ public function testIgnoreScalarsDuringArrayTraversal() $this->assertCount(0, $violations); } - public function testIgnoreNullDuringArrayTraversal() + /** + * @dataProvider getConstraintMethods + */ + public function testIgnoreNullDuringArrayTraversal($constraintMethod) { $entity = new Entity(); $entity->reference = [null]; - $this->metadata->addPropertyConstraint('reference', new Valid()); + $this->metadata->$constraintMethod('reference', new Valid()); $violations = $this->validate($entity); @@ -1218,6 +1239,14 @@ public function testReplaceDefaultGroup($sequence, array $assertViolations) } } + public function getConstraintMethods() + { + return [ + ['addPropertyConstraint'], + ['addGetterConstraint'], + ]; + } + public function getTestReplaceDefaultGroup() { return [ diff --git a/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php b/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php index 38bd945a6ac5..a204cd91f619 100644 --- a/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php +++ b/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php @@ -677,6 +677,10 @@ private function validateGenericNode($value, $object, $cacheKey, MetadataInterfa // See validateClassNode() $cascadedGroups = null !== $cascadedGroups && \count($cascadedGroups) > 0 ? $cascadedGroups : $groups; + if ($value instanceof LazyProperty) { + $value = $value->getPropertyValue(); + } + if (\is_array($value)) { // Arrays are always traversed, independent of the specified // traversal strategy