Skip to content

Commit 7650034

Browse files
committed
Merge pull request #886 from mosch/master
Add allowBlank option to queryparam
2 parents 6bae13c + d50594a commit 7650034

File tree

4 files changed

+40
-13
lines changed

4 files changed

+40
-13
lines changed

Controller/Annotations/Param.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ abstract class Param
3535
public $array = false;
3636
/** @var bool */
3737
public $nullable = false;
38+
/** @var bool */
39+
public $allowBlank = true;
3840

3941
/**
4042
* @return string

Request/ParamFetcher.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Symfony\Component\HttpFoundation\Request;
2020
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
2121
use Symfony\Component\Validator\Constraints\Regex;
22+
use Symfony\Component\Validator\Constraints\NotBlank;
2223
use Symfony\Component\Validator\ValidatorInterface;
2324

2425
/**
@@ -211,6 +212,10 @@ public function cleanParamWithRequirements(Param $config, $param, $strict)
211212
$config->requirements
212213
),
213214
));
215+
216+
if (false === $config->allowBlank) {
217+
$constraint = array(new NotBlank(), $constraint);
218+
}
214219
}
215220

216221
$errors = $this->validator->validateValue($param, $constraint);

Resources/doc/3-listener-support.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,10 @@ class FooController extends Controller
500500
* Note that if the value matches the default then no validation is run.
501501
* So make sure the default value really matches your expectations.
502502
*
503+
* @QueryParam(name="sort", requirements="(asc|desc)+", allowBlank=false, default="asc" description="Sort direction")
504+
*
505+
* Will check if a blank value, e.g an empty string is passed and if so, it will set to the default of asc.
506+
*
503507
* @RequestParam(name="firstname", requirements="[a-z]+", description="Firstname.")
504508
*
505509
* If you want to work with array: ie. ?ids[]=1&ids[]=2&ids[]=1337, use:

Tests/Request/ParamFetcherTest.php

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,15 @@ public function setup()
113113
$annotations['arr']->name = 'arr';
114114
$annotations['arr']->array = true;
115115

116+
$annotations['moo'] = new QueryParam();
117+
$annotations['moo']->name = 'mooh';
118+
$annotations['moo']->key = 'moo';
119+
$annotations['moo']->requirements = '\d+';
120+
$annotations['moo']->default = null;
121+
$annotations['moo']->nullable = true;
122+
$annotations['moo']->allowBlank = false;
123+
$annotations['moo']->description = 'A scalar param with an explicitly defined null default';
124+
116125
$this->paramReader
117126
->expects($this->any())
118127
->method('read')
@@ -178,21 +187,21 @@ public static function validatesConfiguredParamDataProvider()
178187
array( // check that non-strict missing params take default value
179188
'foo',
180189
'1',
181-
array('foo' => '1', 'bar' => '2', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
190+
array('foo' => '1', 'bar' => '2', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
182191
array(),
183192
array('bar' => '2', 'baz' => '4', 'arr' => array()),
184193
),
185194
array( // pass Param in GET
186195
'foo',
187196
'42',
188-
array('foo' => '42', 'bar' => '2', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
197+
array('foo' => '42', 'bar' => '2', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
189198
array('foo' => '42'),
190199
array('bar' => '2', 'baz' => '4', 'arr' => array()),
191200
),
192201
array( // check that invalid non-strict params take default value
193202
'foo',
194203
'1',
195-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
204+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
196205
array('foo' => 'bar'),
197206
array('bar' => '1', 'baz' => '4', 'arr' => array()),
198207
function (\PHPUnit_Framework_MockObject_MockObject $validator, \PHPUnit_Framework_TestCase $self) {
@@ -214,29 +223,29 @@ function (\PHPUnit_Framework_MockObject_MockObject $validator, \PHPUnit_Framewor
214223
array( // invalid array
215224
'buzz',
216225
array(1),
217-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
226+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
218227
array('buzz' => 'invaliddata'),
219228
array('bar' => '1', 'baz' => '4', 'arr' => array()),
220229
),
221230
array( // invalid array (multiple depth)
222231
'buzz',
223232
array(1),
224-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
233+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
225234
array('buzz' => array(array(1))),
226235
array('bar' => '1', 'baz' => '4', 'arr' => array()),
227236
),
228237

229238
array( // multiple array
230239
'buzz',
231240
array(2, 3, 4),
232-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
241+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
233242
array('buzz' => array(2, 3, 4)),
234243
array('bar' => '1', 'baz' => '4', 'arr' => array()),
235244
),
236245
array( // multiple array with one invalid value
237246
'buzz',
238247
array(2, 1, 4),
239-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 1, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
248+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 1, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
240249
array('buzz' => array(2, 'invaliddata', 4)),
241250
array('bar' => '1', 'baz' => '4', 'arr' => array()),
242251
function (\PHPUnit_Framework_MockObject_MockObject $validator, \PHPUnit_Framework_TestCase $self) {
@@ -258,38 +267,45 @@ function (\PHPUnit_Framework_MockObject_MockObject $validator, \PHPUnit_Framewor
258267
array( // Array not provided in GET query
259268
'boo',
260269
array(),
261-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
270+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
262271
array('buzz' => array(2, 3, 4)),
263272
array('bar' => '1', 'baz' => '4', 'arr' => array()),
264273
),
265274
array( // QueryParam provided in GET query but as a scalar
266275
'boo',
267276
array(),
268-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array()),
277+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array(), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
269278
array('buzz' => array(2, 3, 4), 'boo' => 'scalar'),
270279
array('bar' => '1', 'baz' => '4', 'arr' => array()),
271280
),
272281
array( // QueryParam provided in GET query with valid values
273282
'boo',
274283
array('1', 'foo', 5),
275-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => null, 'biz' => null, 'arr' => array()),
284+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
276285
array('buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5)),
277286
array('bar' => '1', 'baz' => '4', 'arr' => array()),
278287
),
279288
array( // QueryParam provided in GET query with valid values
280289
'boozz',
281290
null,
282-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => null, 'biz' => null, 'arr' => array()),
291+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => null, 'biz' => null, 'arr' => array(), 'moo' => null),
283292
array('buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5)),
284293
array('bar' => '1', 'baz' => '4', 'arr' => array()),
285294
),
286295
array( // QueryParam provided in GET query with valid values
287296
'boozz',
288297
5,
289-
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => 5, 'biz' => null, 'arr' => array()),
298+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => 5, 'biz' => null, 'arr' => array(), 'moo' => null),
290299
array('buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => 5),
291300
array('bar' => '1', 'baz' => '4', 'boozz' => 5, 'arr' => array()),
292301
),
302+
array( // QueryParam provided in GET query with valid values
303+
'moo',
304+
'string',
305+
array('foo' => '1', 'bar' => '1', 'baz' => '4', 'buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => 5, 'biz' => null, 'arr' => array(), 'moo' => 'string'),
306+
array('buzz' => array(2, 3, 4), 'boo' => array('1', 'foo', 5), 'boozz' => 5, 'moo' => 'string'),
307+
array('bar' => '1', 'baz' => '4', 'boozz' => 5, 'arr' => array()),
308+
)
293309
);
294310
}
295311

@@ -305,7 +321,7 @@ public function testValidatesAddParam()
305321
$queryFetcher->addParam($runtimeParam);
306322

307323
$this->assertEquals(10, $queryFetcher->get('bub'));
308-
$this->assertEquals(array('foo' => '1', 'bar' => '2', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'bub' => 10, 'arr' => array()), $queryFetcher->all());
324+
$this->assertEquals(array('foo' => '1', 'bar' => '2', 'baz' => '4', 'buzz' => array(1), 'boo' => array(), 'boozz' => null, 'biz' => null, 'bub' => 10, 'arr' => array(), 'moo' => ''), $queryFetcher->all());
309325
}
310326

311327
public function testValidatesConfiguredParamStrictly()

0 commit comments

Comments
 (0)