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 = (new ArgumentResolverTestController ())->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 = (new ArgumentResolverTestController ())->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: []);
@@ -396,11 +413,15 @@ public function controllerTargetingResolver(#[ValueResolver(DefaultValueResolver
396
413
{
397
414
}
398
415
399
- public function controllerTargetingResolverWithDefaultValue (#[ValueResolver(RequestAttributeValueResolver::class)] int $ foo = 2 )
416
+ public function controllerTargetingResolverWithDefaultValue (#[ValueResolver(TestEntityValueResolver::class)] Post $ foo = new Post ('Default ' ))
417
+ {
418
+ }
419
+
420
+ public function controllerTargetingResolverWithNullableValue (#[ValueResolver(TestEntityValueResolver::class)] ?Post $ foo )
400
421
{
401
422
}
402
423
403
- public function controllerTargetingResolverWithNullableValue (#[ValueResolver(RequestAttributeValueResolver ::class)] ? int $ foo )
424
+ public function controllerTargetingResolverWithTestEntity (#[ValueResolver(TestEntityValueResolver ::class)] Post $ foo )
404
425
{
405
426
}
406
427
@@ -425,3 +446,21 @@ public function controllerTargetingUnknownResolver(
425
446
function controller_function ($ foo , $ foobar )
426
447
{
427
448
}
449
+
450
+ class TestEntityValueResolver implements ValueResolverInterface
451
+ {
452
+ public function resolve (Request $ request , ArgumentMetadata $ argument ): iterable
453
+ {
454
+ return Post::class === $ argument ->getType () && $ request ->request ->has ('title ' )
455
+ ? [new Post ($ request ->request ->get ('title ' ))]
456
+ : [];
457
+ }
458
+ }
459
+
460
+ class Post
461
+ {
462
+ public function __construct (
463
+ public readonly string $ title ,
464
+ ) {
465
+ }
466
+ }
0 commit comments