ensure the proper context for nested validations
This commit is contained in:
parent
e62b602dc4
commit
56c8ff8b21
|
@ -287,6 +287,11 @@ class ExecutionContext implements ExecutionContextInterface
|
|||
return $this->group;
|
||||
}
|
||||
|
||||
public function getConstraint()
|
||||
{
|
||||
return $this->constraint;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
namespace Symfony\Component\Validator\Tests\Validator;
|
||||
|
||||
use Symfony\Component\Validator\Constraints\Callback;
|
||||
use Symfony\Component\Validator\Constraints\Collection;
|
||||
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||
use Symfony\Component\Validator\Constraints\NotNull;
|
||||
use Symfony\Component\Validator\Constraints\Traverse;
|
||||
|
@ -720,4 +721,22 @@ abstract class Abstract2Dot5ApiTest extends AbstractValidatorTest
|
|||
$this->assertCount(1, $violations);
|
||||
$this->assertSame($constraint, $violations[0]->getConstraint());
|
||||
}
|
||||
|
||||
public function testCollectionConstraitViolationHasCorrectContext()
|
||||
{
|
||||
$data = array(
|
||||
'foo' => 'fooValue',
|
||||
);
|
||||
|
||||
// Missing field must not be the first in the collection validation
|
||||
$constraint = new Collection(array(
|
||||
'foo' => new NotNull(),
|
||||
'bar' => new NotNull(),
|
||||
));
|
||||
|
||||
$violations = $this->validate($data, $constraint);
|
||||
|
||||
$this->assertCount(1, $violations);
|
||||
$this->assertSame($constraint, $violations[0]->getConstraint());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Validator\Validator;
|
|||
use Symfony\Component\Validator\Constraint;
|
||||
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||
use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
|
||||
use Symfony\Component\Validator\Context\ExecutionContext;
|
||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
|
||||
use Symfony\Component\Validator\Exception\NoSuchMetadataException;
|
||||
|
@ -110,6 +111,11 @@ class RecursiveContextualValidator implements ContextualValidatorInterface
|
|||
$previousMetadata = $this->context->getMetadata();
|
||||
$previousPath = $this->context->getPropertyPath();
|
||||
$previousGroup = $this->context->getGroup();
|
||||
$previousConstraint = null;
|
||||
|
||||
if ($this->context instanceof ExecutionContext || method_exists($this->context, 'getConstraint')) {
|
||||
$previousConstraint = $this->context->getConstraint();
|
||||
}
|
||||
|
||||
// If explicit constraints are passed, validate the value against
|
||||
// those constraints
|
||||
|
@ -138,6 +144,10 @@ class RecursiveContextualValidator implements ContextualValidatorInterface
|
|||
$this->context->setNode($previousValue, $previousObject, $previousMetadata, $previousPath);
|
||||
$this->context->setGroup($previousGroup);
|
||||
|
||||
if (null !== $previousConstraint) {
|
||||
$this->context->setConstraint($previousConstraint);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
Reference in New Issue