From 49064928d8e3b89bb2fb2f6ef399c142c37ad77e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20Sala=C3=BCn?= Date: Mon, 9 Mar 2020 23:45:23 +0100 Subject: [PATCH] [HttpKernel] add deprecation for controller:method syntax in ServiceValueResolver Single colon syntax when referencing a controller as a service is deprecated since Symfony 4.1 but there was no deprecations trigger on runtime. See #35909 --- .../ArgumentResolver/ServiceValueResolver.php | 10 ++++++++ .../ServiceValueResolverTest.php | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/ServiceValueResolver.php b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/ServiceValueResolver.php index 4ffb8c99eb4b..336443265506 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/ServiceValueResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/ServiceValueResolver.php @@ -73,6 +73,16 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable $controller = substr($controller, 0, $i).strtolower(substr($controller, $i)); } + if (false !== strpos($controller, ':') && false === strpos($controller, '::')) { + $i = strrpos($controller, ':'); + $controllerName = substr($controller, 0, $i); + $methodName = substr($controller, $i + 1); + @trigger_error( + sprintf('Referencing a controller as "%1$s:%2$s" is deprecated since Symfony 4.1, use "%1$s::%2$s" instead.', $controllerName, $methodName), + E_USER_DEPRECATED + ); + } + try { yield $this->container->get($controller)->get($argument->getName()); } catch (RuntimeException $e) { diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/ServiceValueResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/ServiceValueResolverTest.php index 4036727bce15..4c6731d8b5f9 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/ServiceValueResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/ServiceValueResolverTest.php @@ -105,6 +105,29 @@ public function testControllerNameIsAnArray() $this->assertYieldEquals([new DummyService()], $resolver->resolve($request, $argument)); } + /** + * @group legacy + * @expectedDeprecation Referencing a controller as "App\Controller\Mine:method" is deprecated since Symfony 4.1, use "App\Controller\Mine::method" instead. + */ + public function testExistingControllerWithSingleColonTriggersDeprecation() + { + $resolver = new ServiceValueResolver(new ServiceLocator([ + 'App\\Controller\\Mine:method' => function () { + return new ServiceLocator([ + 'dummy' => function () { + return new DummyService(); + }, + ]); + }, + ])); + + $request = $this->requestWithAttributes(['_controller' => '\\App\\Controller\\Mine:method']); + $argument = new ArgumentMetadata('dummy', DummyService::class, false, false, null); + + $this->assertTrue($resolver->supports($request, $argument)); + $this->assertYieldEquals([new DummyService()], $resolver->resolve($request, $argument)); + } + public function testErrorIsTruncated() { $this->expectException('Symfony\Component\DependencyInjection\Exception\RuntimeException');