diff options
Diffstat (limited to 'vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php')
-rw-r--r-- | vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php new file mode 100644 index 00000000..dcd9cc55 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php | |||
@@ -0,0 +1,286 @@ | |||
1 | <?php | ||
2 | |||
3 | /* | ||
4 | * This file is part of the Symfony package. | ||
5 | * | ||
6 | * (c) Fabien Potencier <fabien@symfony.com> | ||
7 | * | ||
8 | * For the full copyright and license information, please view the LICENSE | ||
9 | * file that was distributed with this source code. | ||
10 | */ | ||
11 | |||
12 | namespace Symfony\Component\Form\Extension\Validator; | ||
13 | |||
14 | use Symfony\Component\Form\FormTypeGuesserInterface; | ||
15 | use Symfony\Component\Form\Guess\Guess; | ||
16 | use Symfony\Component\Form\Guess\TypeGuess; | ||
17 | use Symfony\Component\Form\Guess\ValueGuess; | ||
18 | use Symfony\Component\Validator\MetadataFactoryInterface; | ||
19 | use Symfony\Component\Validator\Constraint; | ||
20 | |||
21 | class ValidatorTypeGuesser implements FormTypeGuesserInterface | ||
22 | { | ||
23 | private $metadataFactory; | ||
24 | |||
25 | public function __construct(MetadataFactoryInterface $metadataFactory) | ||
26 | { | ||
27 | $this->metadataFactory = $metadataFactory; | ||
28 | } | ||
29 | |||
30 | /** | ||
31 | * {@inheritDoc} | ||
32 | */ | ||
33 | public function guessType($class, $property) | ||
34 | { | ||
35 | $guesser = $this; | ||
36 | |||
37 | return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) { | ||
38 | return $guesser->guessTypeForConstraint($constraint); | ||
39 | }); | ||
40 | } | ||
41 | |||
42 | /** | ||
43 | * {@inheritDoc} | ||
44 | */ | ||
45 | public function guessRequired($class, $property) | ||
46 | { | ||
47 | $guesser = $this; | ||
48 | |||
49 | return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) { | ||
50 | return $guesser->guessRequiredForConstraint($constraint); | ||
51 | // If we don't find any constraint telling otherwise, we can assume | ||
52 | // that a field is not required (with LOW_CONFIDENCE) | ||
53 | }, false); | ||
54 | } | ||
55 | |||
56 | /** | ||
57 | * {@inheritDoc} | ||
58 | */ | ||
59 | public function guessMaxLength($class, $property) | ||
60 | { | ||
61 | $guesser = $this; | ||
62 | |||
63 | return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) { | ||
64 | return $guesser->guessMaxLengthForConstraint($constraint); | ||
65 | }); | ||
66 | } | ||
67 | |||
68 | /** | ||
69 | * {@inheritDoc} | ||
70 | */ | ||
71 | public function guessPattern($class, $property) | ||
72 | { | ||
73 | $guesser = $this; | ||
74 | |||
75 | return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) { | ||
76 | return $guesser->guessPatternForConstraint($constraint); | ||
77 | }); | ||
78 | } | ||
79 | |||
80 | /** | ||
81 | * Guesses a field class name for a given constraint | ||
82 | * | ||
83 | * @param Constraint $constraint The constraint to guess for | ||
84 | * | ||
85 | * @return TypeGuess The guessed field class and options | ||
86 | */ | ||
87 | public function guessTypeForConstraint(Constraint $constraint) | ||
88 | { | ||
89 | switch (get_class($constraint)) { | ||
90 | case 'Symfony\Component\Validator\Constraints\Type': | ||
91 | switch ($constraint->type) { | ||
92 | case 'array': | ||
93 | return new TypeGuess('collection', array(), Guess::MEDIUM_CONFIDENCE); | ||
94 | case 'boolean': | ||
95 | case 'bool': | ||
96 | return new TypeGuess('checkbox', array(), Guess::MEDIUM_CONFIDENCE); | ||
97 | |||
98 | case 'double': | ||
99 | case 'float': | ||
100 | case 'numeric': | ||
101 | case 'real': | ||
102 | return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE); | ||
103 | |||
104 | case 'integer': | ||
105 | case 'int': | ||
106 | case 'long': | ||
107 | return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE); | ||
108 | |||
109 | case '\DateTime': | ||
110 | return new TypeGuess('date', array(), Guess::MEDIUM_CONFIDENCE); | ||
111 | |||
112 | case 'string': | ||
113 | return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); | ||
114 | } | ||
115 | break; | ||
116 | |||
117 | case 'Symfony\Component\Validator\Constraints\Country': | ||
118 | return new TypeGuess('country', array(), Guess::HIGH_CONFIDENCE); | ||
119 | |||
120 | case 'Symfony\Component\Validator\Constraints\Date': | ||
121 | return new TypeGuess('date', array('input' => 'string'), Guess::HIGH_CONFIDENCE); | ||
122 | |||
123 | case 'Symfony\Component\Validator\Constraints\DateTime': | ||
124 | return new TypeGuess('datetime', array('input' => 'string'), Guess::HIGH_CONFIDENCE); | ||
125 | |||
126 | case 'Symfony\Component\Validator\Constraints\Email': | ||
127 | return new TypeGuess('email', array(), Guess::HIGH_CONFIDENCE); | ||
128 | |||
129 | case 'Symfony\Component\Validator\Constraints\File': | ||
130 | case 'Symfony\Component\Validator\Constraints\Image': | ||
131 | return new TypeGuess('file', array(), Guess::HIGH_CONFIDENCE); | ||
132 | |||
133 | case 'Symfony\Component\Validator\Constraints\Language': | ||
134 | return new TypeGuess('language', array(), Guess::HIGH_CONFIDENCE); | ||
135 | |||
136 | case 'Symfony\Component\Validator\Constraints\Locale': | ||
137 | return new TypeGuess('locale', array(), Guess::HIGH_CONFIDENCE); | ||
138 | |||
139 | case 'Symfony\Component\Validator\Constraints\Time': | ||
140 | return new TypeGuess('time', array('input' => 'string'), Guess::HIGH_CONFIDENCE); | ||
141 | |||
142 | case 'Symfony\Component\Validator\Constraints\Url': | ||
143 | return new TypeGuess('url', array(), Guess::HIGH_CONFIDENCE); | ||
144 | |||
145 | case 'Symfony\Component\Validator\Constraints\Ip': | ||
146 | return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE); | ||
147 | |||
148 | case 'Symfony\Component\Validator\Constraints\MaxLength': | ||
149 | case 'Symfony\Component\Validator\Constraints\MinLength': | ||
150 | case 'Symfony\Component\Validator\Constraints\Regex': | ||
151 | return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE); | ||
152 | |||
153 | case 'Symfony\Component\Validator\Constraints\Min': | ||
154 | case 'Symfony\Component\Validator\Constraints\Max': | ||
155 | return new TypeGuess('number', array(), Guess::LOW_CONFIDENCE); | ||
156 | |||
157 | case 'Symfony\Component\Validator\Constraints\MinCount': | ||
158 | case 'Symfony\Component\Validator\Constraints\MaxCount': | ||
159 | return new TypeGuess('collection', array(), Guess::LOW_CONFIDENCE); | ||
160 | |||
161 | case 'Symfony\Component\Validator\Constraints\True': | ||
162 | case 'Symfony\Component\Validator\Constraints\False': | ||
163 | return new TypeGuess('checkbox', array(), Guess::MEDIUM_CONFIDENCE); | ||
164 | } | ||
165 | |||
166 | return null; | ||
167 | } | ||
168 | |||
169 | /** | ||
170 | * Guesses whether a field is required based on the given constraint | ||
171 | * | ||
172 | * @param Constraint $constraint The constraint to guess for | ||
173 | * | ||
174 | * @return Guess The guess whether the field is required | ||
175 | */ | ||
176 | public function guessRequiredForConstraint(Constraint $constraint) | ||
177 | { | ||
178 | switch (get_class($constraint)) { | ||
179 | case 'Symfony\Component\Validator\Constraints\NotNull': | ||
180 | case 'Symfony\Component\Validator\Constraints\NotBlank': | ||
181 | case 'Symfony\Component\Validator\Constraints\True': | ||
182 | return new ValueGuess(true, Guess::HIGH_CONFIDENCE); | ||
183 | } | ||
184 | |||
185 | return null; | ||
186 | } | ||
187 | |||
188 | /** | ||
189 | * Guesses a field's maximum length based on the given constraint | ||
190 | * | ||
191 | * @param Constraint $constraint The constraint to guess for | ||
192 | * | ||
193 | * @return Guess The guess for the maximum length | ||
194 | */ | ||
195 | public function guessMaxLengthForConstraint(Constraint $constraint) | ||
196 | { | ||
197 | switch (get_class($constraint)) { | ||
198 | case 'Symfony\Component\Validator\Constraints\MaxLength': | ||
199 | return new ValueGuess($constraint->limit, Guess::HIGH_CONFIDENCE); | ||
200 | |||
201 | case 'Symfony\Component\Validator\Constraints\Type': | ||
202 | if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) { | ||
203 | return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE); | ||
204 | } | ||
205 | break; | ||
206 | |||
207 | case 'Symfony\Component\Validator\Constraints\Max': | ||
208 | return new ValueGuess(strlen((string) $constraint->limit), Guess::LOW_CONFIDENCE); | ||
209 | } | ||
210 | |||
211 | return null; | ||
212 | } | ||
213 | |||
214 | /** | ||
215 | * Guesses a field's pattern based on the given constraint | ||
216 | * | ||
217 | * @param Constraint $constraint The constraint to guess for | ||
218 | * | ||
219 | * @return Guess The guess for the pattern | ||
220 | */ | ||
221 | public function guessPatternForConstraint(Constraint $constraint) | ||
222 | { | ||
223 | switch (get_class($constraint)) { | ||
224 | case 'Symfony\Component\Validator\Constraints\MinLength': | ||
225 | return new ValueGuess(sprintf('.{%s,}', (string) $constraint->limit), Guess::LOW_CONFIDENCE); | ||
226 | |||
227 | case 'Symfony\Component\Validator\Constraints\Regex': | ||
228 | $htmlPattern = $constraint->getHtmlPattern(); | ||
229 | |||
230 | if (null !== $htmlPattern) { | ||
231 | return new ValueGuess($htmlPattern, Guess::HIGH_CONFIDENCE); | ||
232 | } | ||
233 | break; | ||
234 | |||
235 | case 'Symfony\Component\Validator\Constraints\Min': | ||
236 | return new ValueGuess(sprintf('.{%s,}', strlen((string) $constraint->limit)), Guess::LOW_CONFIDENCE); | ||
237 | |||
238 | case 'Symfony\Component\Validator\Constraints\Type': | ||
239 | if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) { | ||
240 | return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE); | ||
241 | } | ||
242 | break; | ||
243 | } | ||
244 | |||
245 | return null; | ||
246 | } | ||
247 | |||
248 | /** | ||
249 | * Iterates over the constraints of a property, executes a constraints on | ||
250 | * them and returns the best guess | ||
251 | * | ||
252 | * @param string $class The class to read the constraints from | ||
253 | * @param string $property The property for which to find constraints | ||
254 | * @param \Closure $closure The closure that returns a guess | ||
255 | * for a given constraint | ||
256 | * @param mixed $defaultValue The default value assumed if no other value | ||
257 | * can be guessed. | ||
258 | * | ||
259 | * @return Guess The guessed value with the highest confidence | ||
260 | */ | ||
261 | protected function guess($class, $property, \Closure $closure, $defaultValue = null) | ||
262 | { | ||
263 | $guesses = array(); | ||
264 | $classMetadata = $this->metadataFactory->getMetadataFor($class); | ||
265 | |||
266 | if ($classMetadata->hasMemberMetadatas($property)) { | ||
267 | $memberMetadatas = $classMetadata->getMemberMetadatas($property); | ||
268 | |||
269 | foreach ($memberMetadatas as $memberMetadata) { | ||
270 | $constraints = $memberMetadata->getConstraints(); | ||
271 | |||
272 | foreach ($constraints as $constraint) { | ||
273 | if ($guess = $closure($constraint)) { | ||
274 | $guesses[] = $guess; | ||
275 | } | ||
276 | } | ||
277 | } | ||
278 | |||
279 | if (null !== $defaultValue) { | ||
280 | $guesses[] = new ValueGuess($defaultValue, Guess::LOW_CONFIDENCE); | ||
281 | } | ||
282 | } | ||
283 | |||
284 | return Guess::getBestGuess($guesses); | ||
285 | } | ||
286 | } | ||