From 7d2eb5a0e8c9a7ea99506d62a5bedc128dec808f Mon Sep 17 00:00:00 2001 From: Markus Reinhold Date: Sat, 17 Feb 2024 12:36:22 +0100 Subject: [PATCH] [HttpKernel] Allow tagged controllers in ControllerResolver --- ...RegisterControllerArgumentLocatorsPass.php | 8 +++++++ ...sterControllerArgumentLocatorsPassTest.php | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index f2cf2422b0689..8e407d5a8df37 100644 --- a/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -45,6 +45,7 @@ public function process(ContainerBuilder $container) $parameterBag = $container->getParameterBag(); $controllers = []; + $controllerClasses = []; $publicAliases = []; foreach ($container->getAliases() as $id => $alias) { @@ -74,6 +75,8 @@ public function process(ContainerBuilder $container) throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); } + $controllerClasses[] = $class; + // get regular public methods $methods = []; $arguments = []; @@ -227,5 +230,10 @@ public function process(ContainerBuilder $container) } $container->setAlias('argument_resolver.controller_locator', (string) $controllerLocatorRef); + + if ($container->hasDefinition('controller_resolver')) { + $container->getDefinition('controller_resolver') + ->addMethodCall('allowControllers', [array_unique($controllerClasses)]); + } } } diff --git a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php index a7ccb91786cb0..eb5193ae5f48b 100644 --- a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php @@ -557,6 +557,30 @@ public function testTaggedIteratorAndTaggedLocatorAttributes() $this->assertTrue($argLocator->has('foo')); $this->assertSame('bar', $argLocator->get('foo')); } + + public function testTaggedControllersAreRegisteredInControllerResolver() + { + $container = new ContainerBuilder(); + $container->register('argument_resolver.service')->addArgument([]); + $controllerResolver = $container->register('controller_resolver'); + + $container->register('foo', RegisterTestController::class) + ->addTag('controller.service_arguments') + ; + + // duplicates should be removed + $container->register('bar', RegisterTestController::class) + ->addTag('controller.service_arguments') + ; + + // services with no tag should be ignored + $container->register('baz', ControllerDummy::class); + + $pass = new RegisterControllerArgumentLocatorsPass(); + $pass->process($container); + + $this->assertSame([['allowControllers', [[RegisterTestController::class]]]], $controllerResolver->getMethodCalls()); + } } class RegisterTestController