Skip to content

Commit 57b6667

Browse files
committed
Merge 4.0
2 parents a2824ff + 4acec63 commit 57b6667

File tree

6 files changed

+58
-7
lines changed

6 files changed

+58
-7
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,17 @@ On write operations, we added the [expectsHeader](https://www.hydra-cg.com/spec/
120120
* [d0a442786](https://github.com/api-platform/core/commit/d0a44278630d201b91cbba0774a09f4eeaac88f7) feat(doctrine): enhance getLinksHandler with method validation and typo suggestions (#6874)
121121
* [f67f6f1ac](https://github.com/api-platform/core/commit/f67f6f1acb6476182c18a3503f2a8bc80ae89a0b) feat(doctrine): doctrine filters like laravel eloquent filters (#6775)
122122

123+
## v4.0.21
124+
125+
### Bug fixes
126+
127+
* [7cb5a6db8](https://github.com/api-platform/core/commit/7cb5a6db87241d95e6c324318fe861bd4f1820cf) fix: allow parameter provider as object (#7032)
128+
* [bb83e9a03](https://github.com/api-platform/core/commit/bb83e9a034c511156aa20a8555bf367374ef5458) fix(symfony): allow to merge array with string in global defaults (#7037)
129+
* [da2e86809](https://github.com/api-platform/core/commit/da2e86809d4a8dec294dc2fc148d92406f1f7fd1) fix: header parameter should be case insensitive (#7031)
130+
131+
132+
### Features
133+
123134
## v4.0.20
124135

125136
### Bug fixes

src/Metadata/Resource/Factory/OperationDefaultsTrait.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ private function addGlobalDefaults(ApiResource|Operation $operation): ApiResourc
6363
$currentValue = $operation->{$getter}();
6464

6565
if (\is_array($currentValue) && $currentValue) {
66+
if (\is_string($value)) {
67+
$value = [$value];
68+
}
69+
6670
$operation = $operation->{'with'.$upperKey}(array_merge($value, $currentValue));
6771
}
6872

src/State/Provider/ParameterProvider.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
use ApiPlatform\State\Exception\ParameterNotSupportedException;
1919
use ApiPlatform\State\Exception\ProviderNotFoundException;
2020
use ApiPlatform\State\ParameterNotFound;
21-
use ApiPlatform\State\ParameterProviderInterface;
2221
use ApiPlatform\State\ProviderInterface;
2322
use ApiPlatform\State\Util\ParameterParserTrait;
2423
use ApiPlatform\State\Util\RequestParser;
@@ -99,13 +98,15 @@ public function provide(Operation $operation, array $uriVariables = [], array $c
9998
continue;
10099
}
101100

102-
if (!\is_string($provider) || !$this->locator->has($provider)) {
103-
throw new ProviderNotFoundException(\sprintf('Provider "%s" not found on operation "%s"', $provider, $operation->getName()));
101+
if (\is_string($provider)) {
102+
if (!$this->locator->has($provider)) {
103+
throw new ProviderNotFoundException(\sprintf('Provider "%s" not found on operation "%s"', $provider, $operation->getName()));
104+
}
105+
106+
$provider = $this->locator->get($provider);
104107
}
105108

106-
/** @var ParameterProviderInterface $providerInstance */
107-
$providerInstance = $this->locator->get($provider);
108-
if (($op = $providerInstance->provide($parameter, $values, $context)) instanceof Operation) {
109+
if (($op = $provider->provide($parameter, $values, $context)) instanceof Operation) {
109110
$operation = $op;
110111
}
111112
}

src/State/Util/ParameterParserTrait.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ private function extractParameterValues(Parameter $parameter, array $values): st
5050
throw new \RuntimeException('A Parameter should have a key.');
5151
}
5252

53+
if ($parameter instanceof HeaderParameterInterface) {
54+
$key = strtolower($key);
55+
}
56+
5357
$parsedKey = explode('[:property]', $key);
5458
if (isset($parsedKey[0]) && isset($values[$parsedKey[0]])) {
5559
$key = $parsedKey[0];

tests/Fixtures/TestBundle/ApiResource/WithParameter.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
'group' => new QueryParameter(provider: [self::class, 'provideGroup']),
4040
'properties' => new QueryParameter(filter: 'my_dummy.property'),
4141
'service' => new QueryParameter(provider: CustomGroupParameterProvider::class),
42+
'object' => new QueryParameter(provider: new CustomGroupParameterProvider()),
4243
'auth' => new HeaderParameter(provider: [self::class, 'restrictAccess']),
4344
'priority' => new QueryParameter(provider: [self::class, 'assertSecond'], priority: 10),
4445
'priorityb' => new QueryParameter(provider: [self::class, 'assertFirst'], priority: 20),
@@ -79,6 +80,13 @@
7980
parameters: new Parameters([new QueryParameter(key: 'q'), new HeaderParameter(key: 'q')]),
8081
provider: [self::class, 'headerAndQueryProvider']
8182
)]
83+
#[GetCollection(
84+
uriTemplate: 'header_required',
85+
parameters: [
86+
'Req' => new HeaderParameter(required: true, schema: ['type' => 'string']),
87+
],
88+
provider: [self::class, 'headerProvider']
89+
)]
8290
#[QueryParameter(key: 'everywhere')]
8391
class WithParameter
8492
{
@@ -127,7 +135,7 @@ public static function restrictAccess(): void
127135
throw new AccessDeniedHttpException();
128136
}
129137

130-
public static function headerAndQueryProvider(Operation $operation, array $uriVariables = [], array $context = [])
138+
public static function headerAndQueryProvider(Operation $operation, array $uriVariables = [], array $context = []): JsonResponse
131139
{
132140
$parameters = $operation->getParameters();
133141
$values = [$parameters->get('q', HeaderParameter::class)->getValue(), $parameters->get('q', QueryParameter::class)->getValue()];
@@ -154,4 +162,12 @@ public static function toInt(Parameter $parameter, array $parameters = [], array
154162

155163
return $operation->withParameters($parameters);
156164
}
165+
166+
public static function headerProvider(Operation $operation, array $uriVariables = [], array $context = []): JsonResponse
167+
{
168+
$parameters = $operation->getParameters();
169+
$values = [$parameters->get('Req', HeaderParameter::class)->getValue()];
170+
171+
return new JsonResponse($values);
172+
}
157173
}

tests/Functional/Parameters/ParameterTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ public function testWithServiceProvider(): void
5757
$this->assertArrayNotHasKey('a', $response->toArray());
5858
}
5959

60+
public function testWithObjectProvider(): void
61+
{
62+
$response = self::createClient()->request('GET', 'with_parameters/1?service=blabla');
63+
$this->assertArrayNotHasKey('a', $response->toArray());
64+
}
65+
6066
public function testWithHeader(): void
6167
{
6268
self::createClient()->request('GET', 'with_parameters/1?service=blabla', ['headers' => ['auth' => 'foo']]);
@@ -93,4 +99,13 @@ public function testHeaderAndQuery(): void
9399
'blabla',
94100
]);
95101
}
102+
103+
public function testHeaderParameterRequired(): void
104+
{
105+
self::createClient()->request('GET', 'header_required', ['headers' => ['req' => 'blabla']]);
106+
$this->assertResponseStatusCodeSame(200);
107+
108+
self::createClient()->request('GET', 'header_required', ['headers' => []]);
109+
$this->assertResponseStatusCodeSame(422);
110+
}
96111
}

0 commit comments

Comments
 (0)