From 09c191136ad15624eaac830996ffe4c327e155ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Sat, 14 Jan 2012 02:24:14 +0100 Subject: [PATCH] [Validator] Improved dynamic constraints --- src/Symfony/Component/Validator/Validator.php | 6 +++++- .../Fixtures/DynamicConstraintsEntity.php | 15 ++++++++++++--- .../Tests/Component/Validator/ValidatorTest.php | 10 ++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/Validator/Validator.php b/src/Symfony/Component/Validator/Validator.php index a8ec922b0f..714090842d 100644 --- a/src/Symfony/Component/Validator/Validator.php +++ b/src/Symfony/Component/Validator/Validator.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Validator; use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface; +use Symfony\Component\Validator\Mapping\ClassMetadata; /** * The default implementation of the ValidatorInterface. @@ -59,7 +60,10 @@ class Validator implements ValidatorInterface $metadata = $this->metadataFactory->getClassMetadata(get_class($object)); if ($object instanceof ConstraintProviderInterface) { - $object->getConstraints($metadata); + $dynamicMetadata = new ClassMetadata(get_class($object)); + $dynamicMetadata->mergeConstraints($metadata); + $object->getConstraints($dynamicMetadata); + $metadata = $dynamicMetadata; } $walk = function(GraphWalker $walker, $group) use ($metadata, $object) { diff --git a/tests/Symfony/Tests/Component/Validator/Fixtures/DynamicConstraintsEntity.php b/tests/Symfony/Tests/Component/Validator/Fixtures/DynamicConstraintsEntity.php index ae30742616..1cab8339bf 100644 --- a/tests/Symfony/Tests/Component/Validator/Fixtures/DynamicConstraintsEntity.php +++ b/tests/Symfony/Tests/Component/Validator/Fixtures/DynamicConstraintsEntity.php @@ -7,15 +7,24 @@ use Symfony\Component\Validator\Mapping\ClassMetadata; class DynamicConstraintsEntity implements ConstraintProviderInterface { + protected $validationEnabled = false; protected $firstValue; - public function getSecondValue() { + public function setValidation($enabled) + { + $this->validationEnabled = $enabled; + } + + public function getSecondValue() + { return null; } public function getConstraints(ClassMetadata $metadata) { - $metadata->addPropertyConstraint('firstValue', new FailingConstraint()); - $metadata->addGetterConstraint('secondValue', new FailingConstraint()); + if ($this->validationEnabled) { + $metadata->addPropertyConstraint('firstValue', new FailingConstraint()); + $metadata->addGetterConstraint('secondValue', new FailingConstraint()); + } } } diff --git a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php index 05ce9951c1..5bd2c7bc74 100644 --- a/tests/Symfony/Tests/Component/Validator/ValidatorTest.php +++ b/tests/Symfony/Tests/Component/Validator/ValidatorTest.php @@ -129,8 +129,9 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase $entity = new DynamicConstraintsEntity(); $metadata = new ClassMetadata(get_class($entity)); $this->factory->addClassMetadata($metadata); + + $entity->setValidation(true); - // Only the constraint of group "Default" failed $violations = new ConstraintViolationList(); $violations->add(new ConstraintViolation( '', @@ -146,7 +147,12 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase 'secondValue', '' )); - + + $this->assertEquals($violations, $this->validator->validate($entity)); + + $entity->setValidation(false); + + $violations = new ConstraintViolationList(); $this->assertEquals($violations, $this->validator->validate($entity)); }