diff --git a/src/Symfony/Component/Validator/ConstraintValidatorFactory.php b/src/Symfony/Component/Validator/ConstraintValidatorFactory.php index f297cc8758..88b5cefdc2 100644 --- a/src/Symfony/Component/Validator/ConstraintValidatorFactory.php +++ b/src/Symfony/Component/Validator/ConstraintValidatorFactory.php @@ -32,7 +32,7 @@ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface { $className = $constraint->validatedBy(); - if (!isset($this->validators[$className])) { + if (!isset($this->validators[$className]) || $className === 'Symfony\Component\Validator\Constraints\CollectionValidator') { $this->validators[$className] = new $className(); } diff --git a/src/Symfony/Component/Validator/Tests/ExecutionContextTest.php b/src/Symfony/Component/Validator/Tests/ExecutionContextTest.php index 0cd92f711f..abdf6de985 100644 --- a/src/Symfony/Component/Validator/Tests/ExecutionContextTest.php +++ b/src/Symfony/Component/Validator/Tests/ExecutionContextTest.php @@ -16,6 +16,10 @@ use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\ConstraintViolationList; use Symfony\Component\Validator\ExecutionContext; +use Symfony\Component\Validator\Constraints\Collection; +use Symfony\Component\Validator\Tests\Fixtures\ConstraintA; +use Symfony\Component\Validator\ValidationVisitor; +use Symfony\Component\Validator\ConstraintValidatorFactory; class ExecutionContextTest extends \PHPUnit_Framework_TestCase { @@ -410,6 +414,24 @@ class ExecutionContextTest extends \PHPUnit_Framework_TestCase $this->assertEquals('bam.baz', $this->context->getPropertyPath('bam.baz')); } + + public function testGetPropertyPathWithNestedCollectionsMixed() + { + $constraints = new Collection(array( + 'foo' => new Collection(array( + 'foo' => new ConstraintA(), + 'bar' => new ConstraintA(), + )), + 'name' => new ConstraintA() + )); + + $visitor = new ValidationVisitor('Root', $this->metadataFactory, new ConstraintValidatorFactory(), $this->translator); + $context = new ExecutionContext($visitor, $this->translator, self::TRANS_DOMAIN); + $context->validateValue(array('foo' => array('foo' => 'VALID')), $constraints); + $violations = $context->getViolations(); + + $this->assertEquals('[name]', $violations[1]->getPropertyPath()); + } } class ExecutionContextTest_TestClass diff --git a/src/Symfony/Component/Validator/Tests/GraphWalkerTest.php b/src/Symfony/Component/Validator/Tests/GraphWalkerTest.php index cafcc7aa50..d9419f1967 100644 --- a/src/Symfony/Component/Validator/Tests/GraphWalkerTest.php +++ b/src/Symfony/Component/Validator/Tests/GraphWalkerTest.php @@ -581,6 +581,21 @@ class GraphWalkerTest extends \PHPUnit_Framework_TestCase $violations = $this->walker->getViolations(); $this->assertEquals('collection[foo][bar]', $violations[0]->getPropertyPath()); } + + public function testWalkObjectUsesCorrectPropertyPathInViolationsWhenUsingNestedMixedCollections() + { + $constraint = new Collection(array( + 'foo' => new Collection(array( + 'foo' => new ConstraintA(), + 'bar' => new ConstraintA(), + )), + 'name' => new ConstraintA() + )); + + $this->walker->walkConstraint($constraint, array('foo' => array('foo' => 'VALID')), 'Default', 'collection'); + $violations = $this->walker->getViolations(); + $this->assertEquals('collection[name]', $violations[1]->getPropertyPath()); + } protected function getProperty($property) {