|
21 | 21 | use ApiPlatform\Metadata\Metadata;
|
22 | 22 | use ApiPlatform\Metadata\Operations;
|
23 | 23 | use ApiPlatform\Metadata\Parameter;
|
| 24 | +use ApiPlatform\Metadata\Parameters; |
24 | 25 | use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
|
25 | 26 | use ApiPlatform\Metadata\Util\CamelCaseToSnakeCaseNameConverter;
|
26 | 27 | use Psr\Log\LoggerInterface;
|
@@ -86,15 +87,15 @@ private function buildResourceOperations(array $attributes, string $resourceClas
|
86 | 87 | $index = -1;
|
87 | 88 | $operationPriority = 0;
|
88 | 89 | $hasApiResource = false;
|
89 |
| - $globalParameters = []; |
| 90 | + $globalParameters = new Parameters(); |
90 | 91 |
|
91 | 92 | foreach ($attributes as $attribute) {
|
92 | 93 | if (is_a($attribute->getName(), Parameter::class, true)) {
|
93 | 94 | $parameter = $attribute->newInstance();
|
94 | 95 | if (!$k = $parameter->getKey()) {
|
95 | 96 | throw new RuntimeException('Parameter "key" is mandatory when used on a class.');
|
96 | 97 | }
|
97 |
| - $globalParameters[$k] = $parameter; |
| 98 | + $globalParameters->add($k, $parameter); |
98 | 99 | continue;
|
99 | 100 | }
|
100 | 101 |
|
@@ -141,7 +142,7 @@ private function buildResourceOperations(array $attributes, string $resourceClas
|
141 | 142 |
|
142 | 143 | // Loop again and set default operations if none where found
|
143 | 144 | foreach ($resources as $index => $resource) {
|
144 |
| - if ($globalParameters) { |
| 145 | + if (\count($globalParameters) > 0) { |
145 | 146 | $resources[$index] = $resource = $this->mergeOperationParameters($resource, $globalParameters);
|
146 | 147 | }
|
147 | 148 |
|
@@ -232,17 +233,23 @@ private function hasSameOperation(ApiResource $resource, string $operationClass,
|
232 | 233 | /**
|
233 | 234 | * @template T of Metadata
|
234 | 235 | *
|
235 |
| - * @param Parameter[] $globalParameters |
236 |
| - * @param T $resource |
| 236 | + * @param T $resource |
237 | 237 | *
|
238 | 238 | * @return T
|
239 | 239 | */
|
240 |
| - private function mergeOperationParameters(Metadata $resource, array $globalParameters): Metadata |
| 240 | + private function mergeOperationParameters(Metadata $resource, Parameters $globalParameters): Metadata |
241 | 241 | {
|
242 |
| - $parameters = $resource->getParameters() ?? []; |
| 242 | + $parameters = $resource->getParameters() ?? new Parameters(); |
| 243 | + foreach ($globalParameters as $parameterName => $parameter) { |
| 244 | + if ($key = $parameter->getKey()) { |
| 245 | + $parameterName = $key; |
| 246 | + } |
| 247 | + |
| 248 | + if (!$parameters->has($parameterName)) { |
| 249 | + $parameters->add($parameterName, $parameter); |
| 250 | + } |
| 251 | + } |
243 | 252 |
|
244 |
| - return $resource->withParameters( |
245 |
| - (\is_array($parameters) ? $parameters : iterator_to_array($parameters)) + $globalParameters |
246 |
| - ); |
| 253 | + return $resource->withParameters($parameters); |
247 | 254 | }
|
248 | 255 | }
|
0 commit comments