diff --git a/src/Symfony/Component/Validator/Tests/Fixtures/Entity.php b/src/Symfony/Component/Validator/Tests/Fixtures/Entity.php index 16ba8a718ec59..673e62bae7d46 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 07e45f47eb2cb..8482a71a385d2 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 38bd945a6ac53..a204cd91f6194 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
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: