Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Validator\Context; Chris@0: Chris@0: use Symfony\Component\Translation\TranslatorInterface; Chris@0: use Symfony\Component\Validator\Constraint; Chris@0: use Symfony\Component\Validator\ConstraintViolation; Chris@0: use Symfony\Component\Validator\ConstraintViolationList; Chris@0: use Symfony\Component\Validator\Mapping\ClassMetadataInterface; Chris@17: use Symfony\Component\Validator\Mapping\MemberMetadata; Chris@0: use Symfony\Component\Validator\Mapping\MetadataInterface; Chris@0: use Symfony\Component\Validator\Mapping\PropertyMetadataInterface; Chris@0: use Symfony\Component\Validator\Util\PropertyPath; Chris@0: use Symfony\Component\Validator\Validator\ValidatorInterface; Chris@0: use Symfony\Component\Validator\Violation\ConstraintViolationBuilder; Chris@0: Chris@0: /** Chris@0: * The context used and created by {@link ExecutionContextFactory}. Chris@0: * Chris@0: * @author Bernhard Schussek Chris@0: * Chris@0: * @see ExecutionContextInterface Chris@0: * Chris@14: * @internal since version 2.5. Code against ExecutionContextInterface instead. Chris@0: */ Chris@0: class ExecutionContext implements ExecutionContextInterface Chris@0: { Chris@0: /** Chris@0: * @var ValidatorInterface Chris@0: */ Chris@0: private $validator; Chris@0: Chris@0: /** Chris@0: * The root value of the validated object graph. Chris@0: * Chris@0: * @var mixed Chris@0: */ Chris@0: private $root; Chris@0: Chris@0: /** Chris@0: * @var TranslatorInterface Chris@0: */ Chris@0: private $translator; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: private $translationDomain; Chris@0: Chris@0: /** Chris@0: * The violations generated in the current context. Chris@0: * Chris@0: * @var ConstraintViolationList Chris@0: */ Chris@0: private $violations; Chris@0: Chris@0: /** Chris@0: * The currently validated value. Chris@0: * Chris@0: * @var mixed Chris@0: */ Chris@0: private $value; Chris@0: Chris@0: /** Chris@0: * The currently validated object. Chris@0: * Chris@0: * @var object|null Chris@0: */ Chris@0: private $object; Chris@0: Chris@0: /** Chris@0: * The property path leading to the current value. Chris@0: * Chris@0: * @var string Chris@0: */ Chris@0: private $propertyPath = ''; Chris@0: Chris@0: /** Chris@0: * The current validation metadata. Chris@0: * Chris@0: * @var MetadataInterface|null Chris@0: */ Chris@0: private $metadata; Chris@0: Chris@0: /** Chris@0: * The currently validated group. Chris@0: * Chris@0: * @var string|null Chris@0: */ Chris@0: private $group; Chris@0: Chris@0: /** Chris@0: * The currently validated constraint. Chris@0: * Chris@0: * @var Constraint|null Chris@0: */ Chris@0: private $constraint; Chris@0: Chris@0: /** Chris@0: * Stores which objects have been validated in which group. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@17: private $validatedObjects = []; Chris@0: Chris@0: /** Chris@0: * Stores which class constraint has been validated for which object. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@17: private $validatedConstraints = []; Chris@0: Chris@0: /** Chris@0: * Stores which objects have been initialized. Chris@0: * Chris@0: * @var array Chris@0: */ Chris@0: private $initializedObjects; Chris@0: Chris@0: /** Chris@0: * Creates a new execution context. Chris@0: * Chris@0: * @param ValidatorInterface $validator The validator Chris@0: * @param mixed $root The root value of the Chris@0: * validated object graph Chris@0: * @param TranslatorInterface $translator The translator Chris@0: * @param string|null $translationDomain The translation domain to Chris@0: * use for translating Chris@0: * violation messages Chris@0: * Chris@0: * @internal Called by {@link ExecutionContextFactory}. Should not be used Chris@0: * in user code. Chris@0: */ Chris@0: public function __construct(ValidatorInterface $validator, $root, TranslatorInterface $translator, $translationDomain = null) Chris@0: { Chris@0: $this->validator = $validator; Chris@0: $this->root = $root; Chris@0: $this->translator = $translator; Chris@0: $this->translationDomain = $translationDomain; Chris@0: $this->violations = new ConstraintViolationList(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setNode($value, $object, MetadataInterface $metadata = null, $propertyPath) Chris@0: { Chris@0: $this->value = $value; Chris@0: $this->object = $object; Chris@0: $this->metadata = $metadata; Chris@0: $this->propertyPath = (string) $propertyPath; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setGroup($group) Chris@0: { Chris@0: $this->group = $group; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setConstraint(Constraint $constraint) Chris@0: { Chris@0: $this->constraint = $constraint; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function addViolation($message, array $parameters = []) Chris@0: { Chris@0: $this->violations->add(new ConstraintViolation( Chris@0: $this->translator->trans($message, $parameters, $this->translationDomain), Chris@0: $message, Chris@0: $parameters, Chris@0: $this->root, Chris@0: $this->propertyPath, Chris@0: $this->value, Chris@0: null, Chris@0: null, Chris@0: $this->constraint Chris@0: )); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function buildViolation($message, array $parameters = []) Chris@0: { Chris@0: return new ConstraintViolationBuilder( Chris@0: $this->violations, Chris@0: $this->constraint, Chris@0: $message, Chris@0: $parameters, Chris@0: $this->root, Chris@0: $this->propertyPath, Chris@0: $this->value, Chris@0: $this->translator, Chris@0: $this->translationDomain Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getViolations() Chris@0: { Chris@0: return $this->violations; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getValidator() Chris@0: { Chris@0: return $this->validator; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRoot() Chris@0: { Chris@0: return $this->root; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getValue() Chris@0: { Chris@0: return $this->value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getObject() Chris@0: { Chris@0: return $this->object; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMetadata() Chris@0: { Chris@0: return $this->metadata; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getGroup() Chris@0: { Chris@0: return $this->group; Chris@0: } Chris@0: Chris@0: public function getConstraint() Chris@0: { Chris@0: return $this->constraint; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getClassName() Chris@0: { Chris@0: return $this->metadata instanceof MemberMetadata || $this->metadata instanceof ClassMetadataInterface ? $this->metadata->getClassName() : null; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getPropertyName() Chris@0: { Chris@0: return $this->metadata instanceof PropertyMetadataInterface ? $this->metadata->getPropertyName() : null; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getPropertyPath($subPath = '') Chris@0: { Chris@0: return PropertyPath::append($this->propertyPath, $subPath); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function markGroupAsValidated($cacheKey, $groupHash) Chris@0: { Chris@0: if (!isset($this->validatedObjects[$cacheKey])) { Chris@17: $this->validatedObjects[$cacheKey] = []; Chris@0: } Chris@0: Chris@0: $this->validatedObjects[$cacheKey][$groupHash] = true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isGroupValidated($cacheKey, $groupHash) Chris@0: { Chris@0: return isset($this->validatedObjects[$cacheKey][$groupHash]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function markConstraintAsValidated($cacheKey, $constraintHash) Chris@0: { Chris@0: $this->validatedConstraints[$cacheKey.':'.$constraintHash] = true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isConstraintValidated($cacheKey, $constraintHash) Chris@0: { Chris@0: return isset($this->validatedConstraints[$cacheKey.':'.$constraintHash]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function markObjectAsInitialized($cacheKey) Chris@0: { Chris@0: $this->initializedObjects[$cacheKey] = true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isObjectInitialized($cacheKey) Chris@0: { Chris@0: return isset($this->initializedObjects[$cacheKey]); Chris@0: } Chris@0: }