Skip to content

Commit 29e0a6e

Browse files
committed
[HttpKernel] Fix default value ignored with pinned resolvers
1 parent 1048eb6 commit 29e0a6e

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

Diff for: Controller/ArgumentResolver.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ public function getArguments(Request $request, callable $controller, \Reflection
7171
throw new ResolverNotFoundException($resolverName, $this->namedResolvers instanceof ServiceProviderInterface ? array_keys($this->namedResolvers->getProvidedServices()) : []);
7272
}
7373

74-
$argumentValueResolvers = [$this->namedResolvers->get($resolverName)];
74+
$argumentValueResolvers = [
75+
$this->namedResolvers->get($resolverName),
76+
new DefaultValueResolver(),
77+
];
7578
}
7679
}
7780

Diff for: Controller/ArgumentResolver/QueryParameterValueResolver.php

+2-6
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,8 @@ public function resolve(Request $request, ArgumentMetadata $argument): array
3131

3232
$name = $attribute->name ?? $argument->getName();
3333
if (!$request->query->has($name)) {
34-
if ($argument->hasDefaultValue()) {
35-
return [$argument->getDefaultValue()];
36-
}
37-
38-
if ($argument->isNullable()) {
39-
return [null];
34+
if ($argument->isNullable() || $argument->hasDefaultValue()) {
35+
return [];
4036
}
4137

4238
throw new NotFoundHttpException(sprintf('Missing query parameter "%s".', $name));

Diff for: Tests/Controller/ArgumentResolver/QueryParameterValueResolverTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,14 @@ public static function provideTestResolve(): iterable
179179
yield 'parameter not found but nullable' => [
180180
Request::create('/', 'GET'),
181181
new ArgumentMetadata('firstName', 'string', false, false, false, true, [new MapQueryParameter()]),
182-
[null],
182+
[],
183183
null,
184184
];
185185

186186
yield 'parameter not found but optional' => [
187187
Request::create('/', 'GET'),
188188
new ArgumentMetadata('firstName', 'string', false, true, false, attributes: [new MapQueryParameter()]),
189-
[false],
189+
[],
190190
null,
191191
];
192192

Diff for: Tests/Controller/ArgumentResolverTest.php

+28
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,26 @@ public function testTargetedResolver()
296296
$this->assertSame([1], $resolver->getArguments($request, $controller));
297297
}
298298

299+
public function testTargetedResolverWithDefaultValue()
300+
{
301+
$resolver = self::getResolver([], [RequestAttributeValueResolver::class => new RequestAttributeValueResolver()]);
302+
303+
$request = Request::create('/');
304+
$controller = $this->controllerTargetingResolverWithDefaultValue(...);
305+
306+
$this->assertSame([2], $resolver->getArguments($request, $controller));
307+
}
308+
309+
public function testTargetedResolverWithNullableValue()
310+
{
311+
$resolver = self::getResolver([], [RequestAttributeValueResolver::class => new RequestAttributeValueResolver()]);
312+
313+
$request = Request::create('/');
314+
$controller = $this->controllerTargetingResolverWithNullableValue(...);
315+
316+
$this->assertSame([null], $resolver->getArguments($request, $controller));
317+
}
318+
299319
public function testDisabledResolver()
300320
{
301321
$resolver = self::getResolver(namedResolvers: []);
@@ -373,6 +393,14 @@ public function controllerTargetingResolver(#[ValueResolver(DefaultValueResolver
373393
{
374394
}
375395

396+
public function controllerTargetingResolverWithDefaultValue(#[ValueResolver(RequestAttributeValueResolver::class)] int $foo = 2)
397+
{
398+
}
399+
400+
public function controllerTargetingResolverWithNullableValue(#[ValueResolver(RequestAttributeValueResolver::class)] ?int $foo)
401+
{
402+
}
403+
376404
public function controllerDisablingResolver(#[ValueResolver(RequestAttributeValueResolver::class, disabled: true)] int $foo = 1)
377405
{
378406
}

0 commit comments

Comments
 (0)