4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Validator\Validator;
14 use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
15 use Symfony\Component\Validator\Context\ExecutionContextFactoryInterface;
16 use Symfony\Component\Validator\Context\ExecutionContextInterface;
17 use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
18 use Symfony\Component\Validator\ObjectInitializerInterface;
21 * Recursive implementation of {@link ValidatorInterface}.
23 * @author Bernhard Schussek <bschussek@gmail.com>
25 class RecursiveValidator implements ValidatorInterface
27 protected $contextFactory;
28 protected $metadataFactory;
29 protected $validatorFactory;
30 protected $objectInitializers;
33 * Creates a new validator.
35 * @param ExecutionContextFactoryInterface $contextFactory The factory for
36 * creating new contexts
37 * @param MetadataFactoryInterface $metadataFactory The factory for
38 * fetching the metadata
39 * of validated objects
40 * @param ConstraintValidatorFactoryInterface $validatorFactory The factory for creating
41 * constraint validators
42 * @param ObjectInitializerInterface[] $objectInitializers The object initializers
44 public function __construct(ExecutionContextFactoryInterface $contextFactory, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, array $objectInitializers = array())
46 $this->contextFactory = $contextFactory;
47 $this->metadataFactory = $metadataFactory;
48 $this->validatorFactory = $validatorFactory;
49 $this->objectInitializers = $objectInitializers;
55 public function startContext($root = null)
57 return new RecursiveContextualValidator(
58 $this->contextFactory->createContext($this, $root),
59 $this->metadataFactory,
60 $this->validatorFactory,
61 $this->objectInitializers
68 public function inContext(ExecutionContextInterface $context)
70 return new RecursiveContextualValidator(
72 $this->metadataFactory,
73 $this->validatorFactory,
74 $this->objectInitializers
81 public function getMetadataFor($object)
83 return $this->metadataFactory->getMetadataFor($object);
89 public function hasMetadataFor($object)
91 return $this->metadataFactory->hasMetadataFor($object);
97 public function validate($value, $constraints = null, $groups = null)
99 return $this->startContext($value)
100 ->validate($value, $constraints, $groups)
107 public function validateProperty($object, $propertyName, $groups = null)
109 return $this->startContext($object)
110 ->validateProperty($object, $propertyName, $groups)
117 public function validatePropertyValue($objectOrClass, $propertyName, $value, $groups = null)
119 // If a class name is passed, take $value as root
120 return $this->startContext(\is_object($objectOrClass) ? $objectOrClass : $value)
121 ->validatePropertyValue($objectOrClass, $propertyName, $value, $groups)