123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Validator;
- @trigger_error('The '.__NAMESPACE__.'\ValidationVisitor class is deprecated since Symfony 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
- use Symfony\Component\Translation\TranslatorInterface;
- use Symfony\Component\Validator\Exception\NoSuchMetadataException;
- use Symfony\Component\Validator\Exception\UnexpectedTypeException;
- /**
- * Default implementation of {@link ValidationVisitorInterface} and
- * {@link GlobalExecutionContextInterface}.
- *
- * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @deprecated since version 2.5, to be removed in 3.0.
- */
- class ValidationVisitor implements ValidationVisitorInterface, GlobalExecutionContextInterface
- {
- private $root;
- private $metadataFactory;
- private $validatorFactory;
- private $translator;
- private $translationDomain;
- private $objectInitializers;
- private $violations;
- private $validatedObjects = array();
- /**
- * Creates a new validation visitor.
- *
- * @param mixed $root The value passed to the validator
- * @param MetadataFactoryInterface $metadataFactory The factory for obtaining metadata instances
- * @param ConstraintValidatorFactoryInterface $validatorFactory The factory for creating constraint validators
- * @param TranslatorInterface $translator The translator for translating violation messages
- * @param string|null $translationDomain The domain of the translation messages
- * @param ObjectInitializerInterface[] $objectInitializers The initializers for preparing objects before validation
- *
- * @throws UnexpectedTypeException If any of the object initializers is not an instance of ObjectInitializerInterface
- */
- public function __construct($root, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, TranslatorInterface $translator, $translationDomain = null, array $objectInitializers = array())
- {
- foreach ($objectInitializers as $initializer) {
- if (!$initializer instanceof ObjectInitializerInterface) {
- throw new UnexpectedTypeException($initializer, 'Symfony\Component\Validator\ObjectInitializerInterface');
- }
- }
- $this->root = $root;
- $this->metadataFactory = $metadataFactory;
- $this->validatorFactory = $validatorFactory;
- $this->translator = $translator;
- $this->translationDomain = $translationDomain;
- $this->objectInitializers = $objectInitializers;
- $this->violations = new ConstraintViolationList();
- }
- /**
- * {@inheritdoc}
- */
- public function visit(MetadataInterface $metadata, $value, $group, $propertyPath)
- {
- $context = new ExecutionContext(
- $this,
- $this->translator,
- $this->translationDomain,
- $metadata,
- $value,
- $group,
- $propertyPath
- );
- $context->validateValue($value, $metadata->findConstraints($group));
- }
- /**
- * {@inheritdoc}
- */
- public function validate($value, $group, $propertyPath, $traverse = false, $deep = false)
- {
- if (null === $value) {
- return;
- }
- if (\is_object($value)) {
- $hash = spl_object_hash($value);
- // Exit, if the object is already validated for the current group
- if (isset($this->validatedObjects[$hash][$group])) {
- return;
- }
- // Initialize if the object wasn't initialized before
- if (!isset($this->validatedObjects[$hash])) {
- foreach ($this->objectInitializers as $initializer) {
- if (!$initializer instanceof ObjectInitializerInterface) {
- throw new \LogicException('Validator initializers must implement ObjectInitializerInterface.');
- }
- $initializer->initialize($value);
- }
- }
- // Remember validating this object before starting and possibly
- // traversing the object graph
- $this->validatedObjects[$hash][$group] = true;
- }
- // Validate arrays recursively by default, otherwise every driver needs
- // to implement special handling for arrays.
- // https://github.com/symfony/symfony/issues/6246
- if (\is_array($value) || ($traverse && $value instanceof \Traversable)) {
- foreach ($value as $key => $element) {
- // Ignore any scalar values in the collection
- if (\is_object($element) || \is_array($element)) {
- // Only repeat the traversal if $deep is set
- $this->validate($element, $group, $propertyPath.'['.$key.']', $deep, $deep);
- }
- }
- try {
- $this->metadataFactory->getMetadataFor($value)->accept($this, $value, $group, $propertyPath);
- } catch (NoSuchMetadataException $e) {
- // Metadata doesn't necessarily have to exist for
- // traversable objects, because we know how to validate
- // them anyway. Optionally, additional metadata is supported.
- }
- } else {
- $this->metadataFactory->getMetadataFor($value)->accept($this, $value, $group, $propertyPath);
- }
- }
- /**
- * {@inheritdoc}
- */
- public function getViolations()
- {
- return $this->violations;
- }
- /**
- * {@inheritdoc}
- */
- public function getRoot()
- {
- return $this->root;
- }
- /**
- * {@inheritdoc}
- */
- public function getVisitor()
- {
- return $this;
- }
- /**
- * {@inheritdoc}
- */
- public function getValidatorFactory()
- {
- return $this->validatorFactory;
- }
- /**
- * {@inheritdoc}
- */
- public function getMetadataFactory()
- {
- return $this->metadataFactory;
- }
- }
|