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\Validator; Chris@0: Chris@0: use Symfony\Component\Validator\ConstraintValidatorFactoryInterface; Chris@0: use Symfony\Component\Validator\Context\ExecutionContextFactoryInterface; Chris@0: use Symfony\Component\Validator\Context\ExecutionContextInterface; Chris@0: use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface; Chris@0: use Symfony\Component\Validator\ObjectInitializerInterface; Chris@0: Chris@0: /** Chris@0: * Recursive implementation of {@link ValidatorInterface}. Chris@0: * Chris@0: * @author Bernhard Schussek Chris@0: */ Chris@0: class RecursiveValidator implements ValidatorInterface Chris@0: { Chris@0: protected $contextFactory; Chris@0: protected $metadataFactory; Chris@0: protected $validatorFactory; Chris@0: protected $objectInitializers; Chris@0: Chris@0: /** Chris@0: * Creates a new validator. Chris@0: * Chris@0: * @param ExecutionContextFactoryInterface $contextFactory The factory for Chris@0: * creating new contexts Chris@0: * @param MetadataFactoryInterface $metadataFactory The factory for Chris@0: * fetching the metadata Chris@0: * of validated objects Chris@0: * @param ConstraintValidatorFactoryInterface $validatorFactory The factory for creating Chris@0: * constraint validators Chris@0: * @param ObjectInitializerInterface[] $objectInitializers The object initializers Chris@0: */ Chris@17: public function __construct(ExecutionContextFactoryInterface $contextFactory, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, array $objectInitializers = []) Chris@0: { Chris@0: $this->contextFactory = $contextFactory; Chris@0: $this->metadataFactory = $metadataFactory; Chris@0: $this->validatorFactory = $validatorFactory; Chris@0: $this->objectInitializers = $objectInitializers; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function startContext($root = null) Chris@0: { Chris@0: return new RecursiveContextualValidator( Chris@0: $this->contextFactory->createContext($this, $root), Chris@0: $this->metadataFactory, Chris@0: $this->validatorFactory, Chris@0: $this->objectInitializers Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function inContext(ExecutionContextInterface $context) Chris@0: { Chris@0: return new RecursiveContextualValidator( Chris@0: $context, Chris@0: $this->metadataFactory, Chris@0: $this->validatorFactory, Chris@0: $this->objectInitializers Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMetadataFor($object) Chris@0: { Chris@0: return $this->metadataFactory->getMetadataFor($object); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function hasMetadataFor($object) Chris@0: { Chris@0: return $this->metadataFactory->hasMetadataFor($object); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function validate($value, $constraints = null, $groups = null) Chris@0: { Chris@0: return $this->startContext($value) Chris@0: ->validate($value, $constraints, $groups) Chris@0: ->getViolations(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function validateProperty($object, $propertyName, $groups = null) Chris@0: { Chris@0: return $this->startContext($object) Chris@0: ->validateProperty($object, $propertyName, $groups) Chris@0: ->getViolations(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function validatePropertyValue($objectOrClass, $propertyName, $value, $groups = null) Chris@0: { Chris@0: // If a class name is passed, take $value as root Chris@17: return $this->startContext(\is_object($objectOrClass) ? $objectOrClass : $value) Chris@0: ->validatePropertyValue($objectOrClass, $propertyName, $value, $groups) Chris@0: ->getViolations(); Chris@0: } Chris@0: }