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