|
22 | 22 | use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
|
23 | 23 | use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
|
24 | 24 | use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
|
| 25 | +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; |
25 | 26 | use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
|
| 27 | +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface; |
26 | 28 | use Symfony\Component\HttpKernel\Exception\ResolverNotFoundException;
|
27 | 29 | use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest;
|
28 | 30 | use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingSession;
|
@@ -296,6 +298,56 @@ public function testTargetedResolver()
|
296 | 298 | $this->assertSame([1], $resolver->getArguments($request, $controller));
|
297 | 299 | }
|
298 | 300 |
|
| 301 | + public function testTargetedResolverWithDefaultValue() |
| 302 | + { |
| 303 | + $resolver = self::getResolver([], [ |
| 304 | + RequestAttributeValueResolver::class => new RequestAttributeValueResolver(), |
| 305 | + DefaultValueResolver::class => new DefaultValueResolver(), |
| 306 | + ]); |
| 307 | + |
| 308 | + $request = Request::create('/'); |
| 309 | + $controller = $this->controllerTargetingResolverWithDefaultValue(...); |
| 310 | + |
| 311 | + $this->assertSame([2], $resolver->getArguments($request, $controller)); |
| 312 | + } |
| 313 | + |
| 314 | + public function testTargetedResolverWithNullableValue() |
| 315 | + { |
| 316 | + $resolver = self::getResolver([], [ |
| 317 | + RequestAttributeValueResolver::class => new RequestAttributeValueResolver(), |
| 318 | + DefaultValueResolver::class => new DefaultValueResolver(), |
| 319 | + ]); |
| 320 | + |
| 321 | + $request = Request::create('/'); |
| 322 | + $controller = $this->controllerTargetingResolverWithNullableValue(...); |
| 323 | + |
| 324 | + $this->assertSame([null], $resolver->getArguments($request, $controller)); |
| 325 | + } |
| 326 | + |
| 327 | + public function testDefaultValueResolverIsNotAddedIfAlreadyPinned() |
| 328 | + { |
| 329 | + $argumentMetadata = $this->createMock(ArgumentMetadata::class); |
| 330 | + $argumentMetadata->expects($this->once())->method('getAttributesOfType')->willReturn([new ValueResolver(DefaultValueResolver::class)]); |
| 331 | + $argumentMetadata->expects($this->once())->method('hasDefaultValue')->willReturn(false); |
| 332 | + $argumentMetadata->expects($this->once())->method('getType')->willReturn(\stdClass::class); |
| 333 | + $argumentMetadata->expects($this->once())->method('isNullable')->willReturn(false); |
| 334 | + |
| 335 | + $argumentMetadataFactory = $this->createMock(ArgumentMetadataFactoryInterface::class); |
| 336 | + $argumentMetadataFactory->method('createArgumentMetadata')->willReturn([$argumentMetadata]); |
| 337 | + |
| 338 | + $resolver = new ArgumentResolver( |
| 339 | + $argumentMetadataFactory, |
| 340 | + [], |
| 341 | + new ServiceLocator(array_map(fn ($resolver) => fn () => $resolver, [DefaultValueResolver::class => new DefaultValueResolver()])) |
| 342 | + ); |
| 343 | + |
| 344 | + $request = Request::create('/'); |
| 345 | + |
| 346 | + $this->expectException(\RuntimeException::class); |
| 347 | + |
| 348 | + $resolver->getArguments($request, function () {}); |
| 349 | + } |
| 350 | + |
299 | 351 | public function testDisabledResolver()
|
300 | 352 | {
|
301 | 353 | $resolver = self::getResolver(namedResolvers: []);
|
@@ -373,6 +425,14 @@ public function controllerTargetingResolver(#[ValueResolver(DefaultValueResolver
|
373 | 425 | {
|
374 | 426 | }
|
375 | 427 |
|
| 428 | + public function controllerTargetingResolverWithDefaultValue(#[ValueResolver(RequestAttributeValueResolver::class)] int $foo = 2) |
| 429 | + { |
| 430 | + } |
| 431 | + |
| 432 | + public function controllerTargetingResolverWithNullableValue(#[ValueResolver(RequestAttributeValueResolver::class)] ?int $foo) |
| 433 | + { |
| 434 | + } |
| 435 | + |
376 | 436 | public function controllerDisablingResolver(#[ValueResolver(RequestAttributeValueResolver::class, disabled: true)] int $foo = 1)
|
377 | 437 | {
|
378 | 438 | }
|
|
0 commit comments