2222use Symfony \Component \HttpKernel \Controller \ArgumentResolver \DefaultValueResolver ;
2323use Symfony \Component \HttpKernel \Controller \ArgumentResolver \RequestAttributeValueResolver ;
2424use Symfony \Component \HttpKernel \Controller \ArgumentValueResolverInterface ;
25+ use Symfony \Component \HttpKernel \Controller \ValueResolverInterface ;
26+ use Symfony \Component \HttpKernel \ControllerMetadata \ArgumentMetadata ;
2527use Symfony \Component \HttpKernel \ControllerMetadata \ArgumentMetadataFactory ;
2628use Symfony \Component \HttpKernel \Exception \ResolverNotFoundException ;
2729use Symfony \Component \HttpKernel \Tests \Fixtures \Controller \ExtendingRequest ;
@@ -298,24 +300,39 @@ public function testTargetedResolver()
298300
299301 public function testTargetedResolverWithDefaultValue ()
300302 {
301- $ resolver = self ::getResolver ([], [RequestAttributeValueResolver ::class => new RequestAttributeValueResolver ()]);
303+ $ resolver = self ::getResolver ([], [TestEntityValueResolver ::class => new TestEntityValueResolver ()]);
302304
303305 $ request = Request::create ('/ ' );
304306 $ controller = $ this ->controllerTargetingResolverWithDefaultValue (...);
305307
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 );
307313 }
308314
309315 public function testTargetedResolverWithNullableValue ()
310316 {
311- $ resolver = self ::getResolver ([], [RequestAttributeValueResolver ::class => new RequestAttributeValueResolver ()]);
317+ $ resolver = self ::getResolver ([], [TestEntityValueResolver ::class => new TestEntityValueResolver ()]);
312318
313319 $ request = Request::create ('/ ' );
314320 $ controller = $ this ->controllerTargetingResolverWithNullableValue (...);
315321
316322 $ this ->assertSame ([null ], $ resolver ->getArguments ($ request , $ controller ));
317323 }
318324
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+
319336 public function testDisabledResolver ()
320337 {
321338 $ resolver = self ::getResolver (namedResolvers: []);
@@ -393,11 +410,15 @@ public function controllerTargetingResolver(#[ValueResolver(DefaultValueResolver
393410 {
394411 }
395412
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 )
397418 {
398419 }
399420
400- public function controllerTargetingResolverWithNullableValue (#[ValueResolver(RequestAttributeValueResolver ::class)] ? int $ foo )
421+ public function controllerTargetingResolverWithTestEntity (#[ValueResolver(TestEntityValueResolver ::class)] Post $ foo )
401422 {
402423 }
403424
@@ -422,3 +443,21 @@ public function controllerTargetingUnknownResolver(
422443function controller_function ($ foo , $ foobar )
423444{
424445}
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