|
17 | 17 | use Doctrine\Common\Util\ClassUtils; |
18 | 18 | use Symfony\Component\HttpFoundation\Request; |
19 | 19 | use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; |
| 20 | +use Symfony\Component\Validator\Constraints\Regex; |
| 21 | +use Symfony\Component\Validator\ValidatorInterface; |
20 | 22 |
|
21 | 23 | /** |
22 | 24 | * Helper to validate parameters of the active request. |
@@ -48,16 +50,23 @@ class ParamFetcher implements ParamFetcherInterface |
48 | 50 | */ |
49 | 51 | private $controller; |
50 | 52 |
|
| 53 | + /** |
| 54 | + * @var ValidatorInterface |
| 55 | + */ |
| 56 | + private $validator; |
| 57 | + |
51 | 58 | /** |
52 | 59 | * Initializes fetcher. |
53 | 60 | * |
54 | | - * @param ParamReader $paramReader Query param reader |
55 | | - * @param Request $request Active request |
| 61 | + * @param ParamReader $paramReader Query param reader |
| 62 | + * @param Request $request Active request |
| 63 | + * @param ValidatorInterface $validator The validator service |
56 | 64 | */ |
57 | | - public function __construct(ParamReader $paramReader, Request $request) |
| 65 | + public function __construct(ParamReader $paramReader, Request $request, ValidatorInterface $validator) |
58 | 66 | { |
59 | 67 | $this->paramReader = $paramReader; |
60 | | - $this->request = $request; |
| 68 | + $this->request = $request; |
| 69 | + $this->validator = $validator; |
61 | 70 | } |
62 | 71 |
|
63 | 72 | /** |
@@ -103,17 +112,9 @@ public function get($name, $strict = null) |
103 | 112 | } |
104 | 113 |
|
105 | 114 | if ($config->array) { |
106 | | - $failMessage = null; |
107 | | - |
108 | 115 | if (!is_array($param)) { |
109 | | - $failMessage = sprintf("Query parameter value of '%s' is not an array", $name); |
110 | | - } elseif (count($param) !== count($param, COUNT_RECURSIVE)) { |
111 | | - $failMessage = sprintf("Query parameter value of '%s' must not have a depth of more than one", $name); |
112 | | - } |
113 | | - |
114 | | - if (null !== $failMessage) { |
115 | 116 | if ($strict) { |
116 | | - throw new BadRequestHttpException($failMessage); |
| 117 | + throw new BadRequestHttpException(sprintf("Query parameter value of '%s' is not an array", $name)); |
117 | 118 | } |
118 | 119 |
|
119 | 120 | return $default; |
@@ -159,16 +160,39 @@ public function cleanParamWithRequirements(Param $config, $param, $strict) |
159 | 160 | { |
160 | 161 | $default = $config->default; |
161 | 162 |
|
162 | | - if ('' !== $config->requirements |
163 | | - && ($param !== $default || null === $default) |
164 | | - && !preg_match('#^'.$config->requirements.'$#xsu', $param) |
165 | | - ) { |
166 | | - if ($strict) { |
167 | | - $paramType = $config instanceof QueryParam ? 'Query' : 'Request'; |
| 163 | + if (null === $config->requirements || ($param === $default && null !== $default)) { |
| 164 | + |
| 165 | + return $param; |
| 166 | + } |
| 167 | + |
| 168 | + $constraint = $config->requirements; |
168 | 169 |
|
169 | | - throw new BadRequestHttpException( |
170 | | - $paramType . " parameter value '$param', does not match requirements '{$config->requirements}'" |
171 | | - ); |
| 170 | + if (is_scalar($constraint)) { |
| 171 | + if (is_array($param)) { |
| 172 | + if ($strict) { |
| 173 | + throw new BadRequestHttpException("Query parameter is an array"); |
| 174 | + } |
| 175 | + |
| 176 | + return $default; |
| 177 | + } |
| 178 | + |
| 179 | + $constraint = new Regex(array( |
| 180 | + 'pattern' => '#^'.preg_quote($config->requirements).'$#xsu', |
| 181 | + 'message' => sprintf( |
| 182 | + "%s parameter value '%s', does not match requirements '%s'", |
| 183 | + $config instanceof QueryParam ? 'Query' : 'Request', |
| 184 | + $param, |
| 185 | + $config->requirements |
| 186 | + ) |
| 187 | + )); |
| 188 | + } |
| 189 | + |
| 190 | + $errors = $this->validator->validateValue($param, $constraint); |
| 191 | + |
| 192 | + if (0 !== count($errors)) { |
| 193 | + |
| 194 | + if ($strict) { |
| 195 | + throw new BadRequestHttpException((string) $errors); |
172 | 196 | } |
173 | 197 |
|
174 | 198 | return null === $default ? '' : $default; |
|
0 commit comments