Skip to content

Commit bb27dfb

Browse files
committed
review
1 parent f7f2d19 commit bb27dfb

File tree

6 files changed

+42
-82
lines changed

6 files changed

+42
-82
lines changed

src/Metadata/Parameters.php

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,6 @@ public function has(string $key, string $parameterClass = QueryParameter::class)
122122
return false;
123123
}
124124

125-
/**
126-
* @return list<string>
127-
*/
128-
public function keys(): array
129-
{
130-
$keys = [];
131-
foreach ($this->parameters as [$key]) {
132-
$keys[] = $key;
133-
}
134-
135-
return $keys;
136-
}
137-
138125
public function count(): int
139126
{
140127
return \count($this->parameters);

src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ private function normalizeUriVariables(ApiResource|HttpOperation $operation): Ap
235235
}
236236

237237
$normalizedUriVariable = $normalizedUriVariable->withParameterName($normalizedParameterName);
238-
$normalizedUriVariables[$normalizedParameterName] = $normalizedUriVariable->withKey($normalizedParameterName);
238+
$normalizedUriVariables[$normalizedParameterName] = $normalizedUriVariable;
239239
}
240240

241241
return $operation->withUriVariables($normalizedUriVariables);

src/Metadata/Tests/Resource/Factory/UriTemplateResourceMetadataCollectionFactoryTest.php

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -135,60 +135,27 @@ class: AttributeResource::class,
135135
$this->assertEquals(
136136
new ResourceMetadataCollection(AttributeResource::class, [
137137
new ApiResource(
138-
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id')],
138+
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')],
139139
shortName: 'AttributeResource',
140140
class: AttributeResource::class,
141141
operations: [
142-
'_api_/attribute_resources/{id}{._format}_get' => new Get(
143-
uriTemplate: '/attribute_resources/{id}{._format}',
144-
shortName: 'AttributeResource',
145-
class: AttributeResource::class,
146-
controller: 'api_platform.action.placeholder',
147-
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id')],
148-
name: '_api_/attribute_resources/{id}{._format}_get',
149-
),
150-
'_api_/attribute_resources/{id}{._format}_put' => new Put(
151-
uriTemplate: '/attribute_resources/{id}{._format}',
152-
shortName: 'AttributeResource',
153-
class: AttributeResource::class,
154-
controller: 'api_platform.action.placeholder',
155-
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id')],
156-
name: '_api_/attribute_resources/{id}{._format}_put',
157-
),
158-
'_api_/attribute_resources/{id}{._format}_delete' => new Delete(
159-
uriTemplate: '/attribute_resources/{id}{._format}',
160-
shortName: 'AttributeResource',
161-
class: AttributeResource::class,
162-
controller: 'api_platform.action.placeholder',
163-
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id')],
164-
name: '_api_/attribute_resources/{id}{._format}_delete',
165-
),
166-
'_api_/attribute_resources{._format}_get_collection' => new GetCollection(
167-
uriTemplate: '/attribute_resources{._format}',
168-
shortName: 'AttributeResource',
169-
class: AttributeResource::class,
170-
controller: 'api_platform.action.placeholder',
171-
name: '_api_/attribute_resources{._format}_get_collection',
172-
),
142+
'_api_/attribute_resources/{id}{._format}_get' => new Get(uriTemplate: '/attribute_resources/{id}{._format}', shortName: 'AttributeResource', class: AttributeResource::class, controller: 'api_platform.action.placeholder', uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')], name: '_api_/attribute_resources/{id}{._format}_get'),
143+
'_api_/attribute_resources/{id}{._format}_put' => new Put(uriTemplate: '/attribute_resources/{id}{._format}', shortName: 'AttributeResource', class: AttributeResource::class, controller: 'api_platform.action.placeholder', uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')], name: '_api_/attribute_resources/{id}{._format}_put'),
144+
'_api_/attribute_resources/{id}{._format}_delete' => new Delete(uriTemplate: '/attribute_resources/{id}{._format}', shortName: 'AttributeResource', class: AttributeResource::class, controller: 'api_platform.action.placeholder', uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')], name: '_api_/attribute_resources/{id}{._format}_delete'),
145+
'_api_/attribute_resources{._format}_get_collection' => new GetCollection(uriTemplate: '/attribute_resources{._format}', shortName: 'AttributeResource', class: AttributeResource::class, controller: 'api_platform.action.placeholder', name: '_api_/attribute_resources{._format}_get_collection'),
173146
]
174147
),
175148
new ApiResource(
176149
shortName: 'AttributeResource',
177150
class: AttributeResource::class,
178151
uriTemplate: '/dummy/{dummyId}/attribute_resources/{id}',
179-
uriVariables: [
180-
'dummyId' => new Link(fromClass: Dummy::class, identifiers: ['id'], parameterName: 'dummyId', key: 'dummyId'),
181-
'id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id'),
182-
],
152+
uriVariables: ['dummyId' => new Link(fromClass: Dummy::class, identifiers: ['id'], parameterName: 'dummyId'), 'id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')],
183153
operations: [
184154
'_api_/dummy/{dummyId}/attribute_resources/{id}_get' => new Get(
185155
class: AttributeResource::class,
186156
uriTemplate: '/dummy/{dummyId}/attribute_resources/{id}',
187157
shortName: 'AttributeResource',
188-
uriVariables: [
189-
'dummyId' => new Link(fromClass: Dummy::class, identifiers: ['id'], parameterName: 'dummyId', key: 'dummyId'),
190-
'id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id'),
191-
],
158+
uriVariables: ['dummyId' => new Link(fromClass: Dummy::class, identifiers: ['id'], parameterName: 'dummyId'), 'id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')],
192159
extraProperties: ['user_defined_uri_template' => true],
193160
name: '_api_/dummy/{dummyId}/attribute_resources/{id}_get'
194161
),
@@ -198,38 +165,32 @@ class: AttributeResource::class,
198165
shortName: 'AttributeResource',
199166
class: AttributeResource::class,
200167
uriTemplate: '/attribute_resources/by_name/{name}',
201-
uriVariables: ['name' => new Link(fromClass: AttributeResource::class, identifiers: ['name'], parameterName: 'name', key: 'name')],
168+
uriVariables: ['name' => new Link(fromClass: AttributeResource::class, identifiers: ['name'], parameterName: 'name')],
202169
operations: [],
203170
),
204171
new ApiResource(
205172
shortName: 'AttributeResource',
206173
class: AttributeResource::class,
207174
uriTemplate: '/attribute_resources/by_name/{name}',
208-
uriVariables: ['name' => new Link(fromClass: AttributeResource::class, identifiers: ['name'], parameterName: 'name', key: 'name')],
175+
uriVariables: ['name' => new Link(fromClass: AttributeResource::class, identifiers: ['name'], parameterName: 'name')],
209176
operations: [],
210177
),
211178
new ApiResource(
212179
shortName: 'AttributeResource',
213180
class: AttributeResource::class,
214181
uriTemplate: '/dummy/{dummyId}/attribute_resources/{id}',
215-
uriVariables: [
216-
'dummyId' => new Link(fromClass: Dummy::class, identifiers: [], parameterName: 'dummyId', fromProperty: 'id', key: 'dummyId'),
217-
'id' => new Link(fromClass: AttributeResource::class, identifiers: [], parameterName: 'id', fromProperty: 'id', key: 'id'),
218-
],
182+
uriVariables: ['dummyId' => new Link(fromClass: Dummy::class, identifiers: [], parameterName: 'dummyId', fromProperty: 'id'), 'id' => new Link(fromClass: AttributeResource::class, identifiers: [], parameterName: 'id', fromProperty: 'id')],
219183
operations: [],
220184
),
221185
new ApiResource(
222186
shortName: 'AttributeResource',
223187
class: AttributeResource::class,
224188
uriTemplate: '/dummy/{dummyId}/attribute_resources/{id}',
225-
uriVariables: [
226-
'dummyId' => new Link(fromClass: Dummy::class, identifiers: ['id'], parameterName: 'dummyId', key: 'dummyId'),
227-
'id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id'),
228-
],
189+
uriVariables: ['dummyId' => new Link(fromClass: Dummy::class, identifiers: ['id'], parameterName: 'dummyId'), 'id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')],
229190
operations: [],
230191
),
231192
new ApiResource(
232-
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id')],
193+
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')],
233194
shortName: 'AttributeResource',
234195
class: AttributeResource::class,
235196
operations: [
@@ -238,7 +199,7 @@ class: AttributeResource::class,
238199
shortName: 'AttributeResource',
239200
class: AttributeResource::class,
240201
controller: 'api_platform.action.placeholder',
241-
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id', key: 'id')],
202+
uriVariables: ['id' => new Link(fromClass: AttributeResource::class, identifiers: ['id'], parameterName: 'id')],
242203
routePrefix: '/prefix',
243204
name: '_api_/prefix/attribute_resources/{id}{._format}_get'),
244205
]

src/State/ParameterProvider/IriConverterParameterProvider.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,21 @@ public function provide(Parameter $parameter, array $parameters = [], array $con
3838
return $operation;
3939
}
4040

41+
$iriConverterContext = ['fetch_data' => $parameter->getExtraProperties()['fetch_data'] ?? false];
42+
4143
if (\is_array($value)) {
4244
$entities = [];
4345
foreach ($value as $v) {
44-
$entities[] = $this->iriConverter->getResourceFromIri($v, [
45-
'fetch_data' => $parameter->getExtraProperties()['fetch_data'] ?? false,
46-
]);
46+
$entities[] = $this->iriConverter->getResourceFromIri($v, $iriConverterContext);
4747
}
4848

4949
$parameter->setValue($entities);
50-
} else {
51-
$parameter->setValue($this->iriConverter->getResourceFromIri($value, [
52-
'fetch_data' => $parameter->getExtraProperties()['fetch_data'] ?? false,
53-
]));
50+
51+
return $operation;
5452
}
5553

54+
$parameter->setValue($this->iriConverter->getResourceFromIri($value, $iriConverterContext));
55+
5656
return $operation;
5757
}
5858
}

src/State/ParameterProvider/ReadLinkParameterProvider.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,17 @@ private function getUriVariables(mixed $value, Parameter $parameter, Operation $
108108
}
109109

110110
if (!\is_array($value)) {
111-
return [1 === \count($links) ? current($links)->getKey() : ($extraProperties['uri_variable'] ?? $parameter->getKey()) => $value];
111+
$uriVariables = [];
112+
113+
foreach ($links as $key => $link) {
114+
if (!\is_string($key)) {
115+
$key = $link->getParameterName() ?? $extraProperties['uri_variable'];
116+
}
117+
118+
$uriVariables[$key] = $value;
119+
}
120+
121+
return $uriVariables;
112122
}
113123

114124
return $value;

src/State/Provider/ParameterProvider.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313

1414
namespace ApiPlatform\State\Provider;
1515

16-
use ApiPlatform\Metadata\GraphQl\Operation as GraphQlOperation;
1716
use ApiPlatform\Metadata\HttpOperation;
1817
use ApiPlatform\Metadata\Operation;
1918
use ApiPlatform\Metadata\Parameter;
2019
use ApiPlatform\Metadata\Parameters;
20+
use ApiPlatform\Metadata\QueryParameter;
2121
use ApiPlatform\State\Exception\ParameterNotSupportedException;
2222
use ApiPlatform\State\Exception\ProviderNotFoundException;
2323
use ApiPlatform\State\ParameterNotFound;
@@ -59,7 +59,9 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
5959
if ($operation instanceof HttpOperation && true === $operation->getStrictQueryParameterValidation()) {
6060
$keys = [];
6161
foreach ($parameters as $parameter) {
62-
$keys[] = $parameter->getKey();
62+
if ($parameter instanceof QueryParameter) {
63+
$keys[] = $parameter->getKey();
64+
}
6365
}
6466

6567
foreach (array_keys($request->attributes->get('_api_query_parameters')) as $key) {
@@ -91,7 +93,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
9193
$operation = $operation->withParameters($parameters);
9294
}
9395

94-
if ($operation instanceof HttpOperation || $operation instanceof GraphQlOperation) {
96+
if ($operation instanceof HttpOperation) {
9597
$operation = $this->handlePathParameters($operation, $uriVariables, $context);
9698
}
9799

@@ -102,22 +104,22 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
102104
}
103105

104106
/**
105-
* TODO: this could be in the Parameters list prepare that change in 4.3 as it can break things.
107+
* TODO: uriVariables could be a Parameters instance, it'd make things easier.
106108
*
107109
* @param array<string, mixed> $uriVariables
108110
* @param array<string, mixed> $context
109111
*/
110-
private function handlePathParameters(GraphQlOperation|HttpOperation $operation, array $uriVariables, array $context): GraphQlOperation|HttpOperation
112+
private function handlePathParameters(HttpOperation $operation, array $uriVariables, array $context): HttpOperation
111113
{
112-
$links = $operation instanceof HttpOperation ? $operation->getUriVariables() : $operation->getLinks();
113-
foreach ($links ?? [] as $key => $uriVariable) {
114+
foreach ($operation->getUriVariables() ?? [] as $key => $uriVariable) {
115+
$uriVariable = $uriVariable->withKey($key);
114116
if ($uriVariable->getSecurity() && !$uriVariable->getProvider()) {
115117
$uriVariable = $uriVariable->withProvider(ReadLinkParameterProvider::class);
116118
}
117119

118120
$values = $uriVariables;
119121

120-
if (!isset($uriVariables[$key])) {
122+
if (!\array_key_exists($key, $uriVariables)) {
121123
continue;
122124
}
123125

0 commit comments

Comments
 (0)