Skip to content

Commit 225501b

Browse files
committed
Merge pull request #515 from Simperfit/issue-509-v1
[V1] fix #509 - php's parse str does not allow dots
2 parents 684a621 + e59af5c commit 225501b

File tree

3 files changed

+146
-2
lines changed

3 files changed

+146
-2
lines changed

Hydra/Serializer/CollectionNormalizer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Dunglas\ApiBundle\JsonLd\ContextBuilder;
1919
use Dunglas\ApiBundle\JsonLd\Serializer\ContextTrait;
2020
use Dunglas\ApiBundle\Model\PaginatorInterface;
21+
use Dunglas\ApiBundle\Util\RequestParser;
2122
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
2223
use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
2324

@@ -147,7 +148,7 @@ private function parseRequestUri($requestUri)
147148

148149
$parameters = [];
149150
if (isset($parts['query'])) {
150-
parse_str($parts['query'], $parameters);
151+
$parameters = RequestParser::parseRequestParams($parts['query']);
151152

152153
// Remove existing page parameter
153154
if (isset($parameters[$this->pageParameterName])) {

Util/RequestParser.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static function parseAndDuplicateRequest(Request $request)
4747
*
4848
* @return array
4949
*/
50-
private static function parseRequestParams($source)
50+
public static function parseRequestParams($source)
5151
{
5252
$source = urldecode($source);
5353

features/doctrine/date-filter.feature

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,146 @@ Feature: Order filter on collections
294294
}
295295
}
296296
"""
297+
298+
@dropSchema
299+
@createSchema
300+
Scenario: Get collection filtered by association date
301+
Given there is "2" dummy objects with dummyDate and relatedDummy
302+
When I send a "GET" request to "/dummies?relatedDummy.dummyDate[after]=2015-04-28"
303+
Then the response status code should be 200
304+
And the response should be in JSON
305+
And the header "Content-Type" should be equal to "application/ld+json"
306+
And the JSON should be equal to:
307+
"""
308+
{
309+
"@context": "/contexts/Dummy",
310+
"@id": "/dummies?relatedDummy.dummyDate[after]=2015-04-28",
311+
"@type": "hydra:PagedCollection",
312+
"hydra:totalItems": 0,
313+
"hydra:itemsPerPage": 3,
314+
"hydra:firstPage": "/dummies?relatedDummy.dummyDate%5Bafter%5D=2015-04-28",
315+
"hydra:lastPage": "/dummies?relatedDummy.dummyDate%5Bafter%5D=2015-04-28",
316+
"hydra:member": [],
317+
"hydra:search": {
318+
"@type": "hydra:IriTemplate",
319+
"hydra:template": "/dummies{?id,name,alias,description,relatedDummy.name,relatedDummies[],dummy,order[id],order[name],order[relatedDummy.symfony],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],dummyDate[before],dummyDate[after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[after]}",
320+
"hydra:variableRepresentation": "BasicRepresentation",
321+
"hydra:mapping": [
322+
{
323+
"@type": "IriTemplateMapping",
324+
"variable": "id",
325+
"property": "id",
326+
"required": false
327+
},
328+
{
329+
"@type": "IriTemplateMapping",
330+
"variable": "name",
331+
"property": "name",
332+
"required": false
333+
},
334+
{
335+
"@type": "IriTemplateMapping",
336+
"variable": "alias",
337+
"property": "alias",
338+
"required": false
339+
},
340+
{
341+
"@type": "IriTemplateMapping",
342+
"variable": "description",
343+
"property": "description",
344+
"required": false
345+
},
346+
{
347+
"@type": "IriTemplateMapping",
348+
"variable": "relatedDummy.name",
349+
"property": "relatedDummy.name",
350+
"required": false
351+
},
352+
{
353+
"@type": "IriTemplateMapping",
354+
"variable": "relatedDummies[]",
355+
"property": "relatedDummies",
356+
"required": false
357+
},
358+
{
359+
"@type": "IriTemplateMapping",
360+
"variable": "dummy",
361+
"property": "dummy",
362+
"required": false
363+
},
364+
{
365+
"@type": "IriTemplateMapping",
366+
"variable": "order[id]",
367+
"property": "id",
368+
"required": false
369+
},
370+
{
371+
"@type": "IriTemplateMapping",
372+
"variable": "order[name]",
373+
"property": "name",
374+
"required": false
375+
},
376+
{
377+
"@type": "IriTemplateMapping",
378+
"variable": "order[relatedDummy.symfony]",
379+
"property": "relatedDummy.symfony",
380+
"required": false
381+
},
382+
{
383+
"@type": "IriTemplateMapping",
384+
"variable": "dummyPrice[between]",
385+
"property": "dummyPrice",
386+
"required": false
387+
},
388+
{
389+
"@type": "IriTemplateMapping",
390+
"variable": "dummyPrice[gt]",
391+
"property": "dummyPrice",
392+
"required": false
393+
},
394+
{
395+
"@type": "IriTemplateMapping",
396+
"variable": "dummyPrice[gte]",
397+
"property": "dummyPrice",
398+
"required": false
399+
},
400+
{
401+
"@type": "IriTemplateMapping",
402+
"variable": "dummyPrice[lt]",
403+
"property": "dummyPrice",
404+
"required": false
405+
},
406+
{
407+
"@type": "IriTemplateMapping",
408+
"variable": "dummyPrice[lte]",
409+
"property": "dummyPrice",
410+
"required": false
411+
},
412+
{
413+
"@type": "IriTemplateMapping",
414+
"variable": "dummyDate[before]",
415+
"property": "dummyDate",
416+
"required": false
417+
},
418+
{
419+
"@type": "IriTemplateMapping",
420+
"variable": "dummyDate[after]",
421+
"property": "dummyDate",
422+
"required": false
423+
},
424+
{
425+
"@type": "IriTemplateMapping",
426+
"variable": "relatedDummy.dummyDate[before]",
427+
"property": "relatedDummy.dummyDate",
428+
"required": false
429+
},
430+
{
431+
"@type": "IriTemplateMapping",
432+
"variable": "relatedDummy.dummyDate[after]",
433+
"property": "relatedDummy.dummyDate",
434+
"required": false
435+
}
436+
]
437+
}
438+
}
439+
"""

0 commit comments

Comments
 (0)