Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Symfony package.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Symfony\Component\Validator\Validator;
|
Chris@0
|
13
|
Chris@0
|
14 use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
|
Chris@0
|
15 use Symfony\Component\Validator\Context\ExecutionContextFactoryInterface;
|
Chris@0
|
16 use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
Chris@0
|
17 use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
|
Chris@0
|
18 use Symfony\Component\Validator\ObjectInitializerInterface;
|
Chris@0
|
19
|
Chris@0
|
20 /**
|
Chris@0
|
21 * Recursive implementation of {@link ValidatorInterface}.
|
Chris@0
|
22 *
|
Chris@0
|
23 * @author Bernhard Schussek <bschussek@gmail.com>
|
Chris@0
|
24 */
|
Chris@0
|
25 class RecursiveValidator implements ValidatorInterface
|
Chris@0
|
26 {
|
Chris@0
|
27 protected $contextFactory;
|
Chris@0
|
28 protected $metadataFactory;
|
Chris@0
|
29 protected $validatorFactory;
|
Chris@0
|
30 protected $objectInitializers;
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * Creates a new validator.
|
Chris@0
|
34 *
|
Chris@0
|
35 * @param ExecutionContextFactoryInterface $contextFactory The factory for
|
Chris@0
|
36 * creating new contexts
|
Chris@0
|
37 * @param MetadataFactoryInterface $metadataFactory The factory for
|
Chris@0
|
38 * fetching the metadata
|
Chris@0
|
39 * of validated objects
|
Chris@0
|
40 * @param ConstraintValidatorFactoryInterface $validatorFactory The factory for creating
|
Chris@0
|
41 * constraint validators
|
Chris@0
|
42 * @param ObjectInitializerInterface[] $objectInitializers The object initializers
|
Chris@0
|
43 */
|
Chris@17
|
44 public function __construct(ExecutionContextFactoryInterface $contextFactory, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, array $objectInitializers = [])
|
Chris@0
|
45 {
|
Chris@0
|
46 $this->contextFactory = $contextFactory;
|
Chris@0
|
47 $this->metadataFactory = $metadataFactory;
|
Chris@0
|
48 $this->validatorFactory = $validatorFactory;
|
Chris@0
|
49 $this->objectInitializers = $objectInitializers;
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * {@inheritdoc}
|
Chris@0
|
54 */
|
Chris@0
|
55 public function startContext($root = null)
|
Chris@0
|
56 {
|
Chris@0
|
57 return new RecursiveContextualValidator(
|
Chris@0
|
58 $this->contextFactory->createContext($this, $root),
|
Chris@0
|
59 $this->metadataFactory,
|
Chris@0
|
60 $this->validatorFactory,
|
Chris@0
|
61 $this->objectInitializers
|
Chris@0
|
62 );
|
Chris@0
|
63 }
|
Chris@0
|
64
|
Chris@0
|
65 /**
|
Chris@0
|
66 * {@inheritdoc}
|
Chris@0
|
67 */
|
Chris@0
|
68 public function inContext(ExecutionContextInterface $context)
|
Chris@0
|
69 {
|
Chris@0
|
70 return new RecursiveContextualValidator(
|
Chris@0
|
71 $context,
|
Chris@0
|
72 $this->metadataFactory,
|
Chris@0
|
73 $this->validatorFactory,
|
Chris@0
|
74 $this->objectInitializers
|
Chris@0
|
75 );
|
Chris@0
|
76 }
|
Chris@0
|
77
|
Chris@0
|
78 /**
|
Chris@0
|
79 * {@inheritdoc}
|
Chris@0
|
80 */
|
Chris@0
|
81 public function getMetadataFor($object)
|
Chris@0
|
82 {
|
Chris@0
|
83 return $this->metadataFactory->getMetadataFor($object);
|
Chris@0
|
84 }
|
Chris@0
|
85
|
Chris@0
|
86 /**
|
Chris@0
|
87 * {@inheritdoc}
|
Chris@0
|
88 */
|
Chris@0
|
89 public function hasMetadataFor($object)
|
Chris@0
|
90 {
|
Chris@0
|
91 return $this->metadataFactory->hasMetadataFor($object);
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * {@inheritdoc}
|
Chris@0
|
96 */
|
Chris@0
|
97 public function validate($value, $constraints = null, $groups = null)
|
Chris@0
|
98 {
|
Chris@0
|
99 return $this->startContext($value)
|
Chris@0
|
100 ->validate($value, $constraints, $groups)
|
Chris@0
|
101 ->getViolations();
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 /**
|
Chris@0
|
105 * {@inheritdoc}
|
Chris@0
|
106 */
|
Chris@0
|
107 public function validateProperty($object, $propertyName, $groups = null)
|
Chris@0
|
108 {
|
Chris@0
|
109 return $this->startContext($object)
|
Chris@0
|
110 ->validateProperty($object, $propertyName, $groups)
|
Chris@0
|
111 ->getViolations();
|
Chris@0
|
112 }
|
Chris@0
|
113
|
Chris@0
|
114 /**
|
Chris@0
|
115 * {@inheritdoc}
|
Chris@0
|
116 */
|
Chris@0
|
117 public function validatePropertyValue($objectOrClass, $propertyName, $value, $groups = null)
|
Chris@0
|
118 {
|
Chris@0
|
119 // If a class name is passed, take $value as root
|
Chris@17
|
120 return $this->startContext(\is_object($objectOrClass) ? $objectOrClass : $value)
|
Chris@0
|
121 ->validatePropertyValue($objectOrClass, $propertyName, $value, $groups)
|
Chris@0
|
122 ->getViolations();
|
Chris@0
|
123 }
|
Chris@0
|
124 }
|