Skip to content

Commit c284176

Browse files
authored
feat: support for dot-syntax query parameters in RequestBuilder (#8434)
1 parent 8517f23 commit c284176

4 files changed

Lines changed: 41 additions & 3 deletions

File tree

Core/src/RequestBuilder.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,17 @@ public function build($resource, $method, array $options = [])
112112
unset($options[$parameter]);
113113
}
114114

115-
if ($parameterOptions['location'] === 'query' && array_key_exists($parameter, $options)) {
116-
$query[$parameter] = $options[$parameter];
115+
if ($parameterOptions['location'] === 'query') {
116+
// flatten nested querystring parameters into dot-syntax
117+
if (false !== strpos($parameter, '.')) {
118+
list($object, $property) = explode('.', $parameter, 2);
119+
if (isset($options[$object][$property])) {
120+
$options[$parameter] = $options[$object][$property];
121+
}
122+
}
123+
if (array_key_exists($parameter, $options)) {
124+
$query[$parameter] = $options[$parameter];
125+
}
117126
}
118127
}
119128
}

Core/tests/Unit/RequestBuilderTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,31 @@ public function testBuildsNestedRequest()
7474
$this->assertEquals('{"referenceProp":"reference"}', (string) $request->getBody());
7575
}
7676

77+
public function testBuildsRequestWithObjectQuery()
78+
{
79+
// assert defining query parameters as arrays is flattened in querystring
80+
$request = $this->builder->build('myResource', 'myMethod', [
81+
'object' => ['queryParam' => 'object-query'],
82+
]);
83+
$uri = $request->getUri();
84+
$this->assertEquals('object.queryParam=object-query', $uri->getQuery());
85+
86+
// assert dot syntax works as well
87+
$request = $this->builder->build('myResource', 'myMethod', [
88+
'object.queryParam' => 'object-query-with-dot',
89+
]);
90+
$uri = $request->getUri();
91+
$this->assertEquals('object.queryParam=object-query-with-dot', $uri->getQuery());
92+
93+
// assert the object syntax takes precedence
94+
$request = $this->builder->build('myResource', 'myMethod', [
95+
'object' => ['queryParam' => 'object-query'],
96+
'object.queryParam' => 'object-query-with-dot',
97+
]);
98+
$uri = $request->getUri();
99+
$this->assertEquals('object.queryParam=object-query', $uri->getQuery());
100+
}
101+
77102
public function testBuildsNestedRequestWithStringSplitting()
78103
{
79104
$builder = new RequestBuilder(

Core/tests/Unit/fixtures/service-fixture.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
"type": "string",
2121
"location": "query"
2222
},
23+
"object.queryParam": {
24+
"type": "string",
25+
"location": "query"
26+
},
2327
"pathParam": {
2428
"type": "string",
2529
"required": true,

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"phpdocumentor/reflection": "^5.0||^6.0",
5959
"erusev/parsedown": "^1.6",
6060
"phpseclib/phpseclib": "^3.0",
61-
"google/cloud-tools": "^0.15.0",
61+
"google/cloud-tools": "^0.16.0",
6262
"opis/closure": "^3.0",
6363
"flix-tech/avro-php": "^5.0.0",
6464
"phpspec/prophecy-phpunit": "^2.1",

0 commit comments

Comments
 (0)