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 \Controller \ValueResolverInterface ;
26
+ use Symfony \Component \HttpKernel \ControllerMetadata \ArgumentMetadata ;
25
27
use Symfony \Component \HttpKernel \ControllerMetadata \ArgumentMetadataFactory ;
26
28
use Symfony \Component \HttpKernel \Exception \ResolverNotFoundException ;
27
29
use Symfony \Component \HttpKernel \Tests \Fixtures \Controller \ExtendingRequest ;
@@ -298,24 +300,39 @@ public function testTargetedResolver()
298
300
299
301
public function testTargetedResolverWithDefaultValue ()
300
302
{
301
- $ resolver = self ::getResolver ([], [RequestAttributeValueResolver ::class => new RequestAttributeValueResolver ()]);
303
+ $ resolver = self ::getResolver ([], [TestEntityValueResolver ::class => new TestEntityValueResolver ()]);
302
304
303
305
$ request = Request::create ('/ ' );
304
306
$ controller = $ this ->controllerTargetingResolverWithDefaultValue (...);
305
307
306
- $ this ->assertSame ([2 ], $ resolver ->getArguments ($ request , $ controller ));
308
+ /** @var Post[] $arguments */
309
+ $ arguments = $ resolver ->getArguments ($ request , $ controller );
310
+
311
+ $ this ->assertCount (1 , $ arguments );
312
+ $ this ->assertSame ('Default ' , $ arguments [0 ]->title );
307
313
}
308
314
309
315
public function testTargetedResolverWithNullableValue ()
310
316
{
311
- $ resolver = self ::getResolver ([], [RequestAttributeValueResolver ::class => new RequestAttributeValueResolver ()]);
317
+ $ resolver = self ::getResolver ([], [TestEntityValueResolver ::class => new TestEntityValueResolver ()]);
312
318
313
319
$ request = Request::create ('/ ' );
314
320
$ controller = $ this ->controllerTargetingResolverWithNullableValue (...);
315
321
316
322
$ this ->assertSame ([null ], $ resolver ->getArguments ($ request , $ controller ));
317
323
}
318
324
325
+ public function testTargetedResolverWithRequestAttributeValue ()
326
+ {
327
+ $ resolver = self ::getResolver ([], [TestEntityValueResolver::class => new TestEntityValueResolver ()]);
328
+
329
+ $ request = Request::create ('/ ' );
330
+ $ request ->attributes ->set ('foo ' , $ object = new Post ('Random ' .time ()));
331
+ $ controller = $ this ->controllerTargetingResolverWithTestEntity (...);
332
+
333
+ $ this ->assertSame ([$ object ], $ resolver ->getArguments ($ request , $ controller ));
334
+ }
335
+
319
336
public function testDisabledResolver ()
320
337
{
321
338
$ resolver = self ::getResolver (namedResolvers: []);
@@ -393,11 +410,15 @@ public function controllerTargetingResolver(#[ValueResolver(DefaultValueResolver
393
410
{
394
411
}
395
412
396
- public function controllerTargetingResolverWithDefaultValue (#[ValueResolver(RequestAttributeValueResolver::class)] int $ foo = 2 )
413
+ public function controllerTargetingResolverWithDefaultValue (#[ValueResolver(TestEntityValueResolver::class)] Post $ foo = new Post ('Default ' ))
414
+ {
415
+ }
416
+
417
+ public function controllerTargetingResolverWithNullableValue (#[ValueResolver(TestEntityValueResolver::class)] ?Post $ foo )
397
418
{
398
419
}
399
420
400
- public function controllerTargetingResolverWithNullableValue (#[ValueResolver(RequestAttributeValueResolver ::class)] ? int $ foo )
421
+ public function controllerTargetingResolverWithTestEntity (#[ValueResolver(TestEntityValueResolver ::class)] Post $ foo )
401
422
{
402
423
}
403
424
@@ -422,3 +443,21 @@ public function controllerTargetingUnknownResolver(
422
443
function controller_function ($ foo , $ foobar )
423
444
{
424
445
}
446
+
447
+ class TestEntityValueResolver implements ValueResolverInterface
448
+ {
449
+ public function resolve (Request $ request , ArgumentMetadata $ argument ): iterable
450
+ {
451
+ return Post::class === $ argument ->getType () && $ request ->request ->has ('title ' )
452
+ ? [new Post ($ request ->request ->get ('title ' ))]
453
+ : [];
454
+ }
455
+ }
456
+
457
+ class Post
458
+ {
459
+ public function __construct (
460
+ public readonly string $ title ,
461
+ ) {
462
+ }
463
+ }
0 commit comments