From 6fdf2527d6f99ac1cafa006f87549cdecfbb582e Mon Sep 17 00:00:00 2001 From: Amrouche Hamza Date: Sun, 14 Jul 2019 17:05:44 +0200 Subject: [PATCH 1/2] [HttpKernel] trim the leading backslash in the controller init --- .../ContainerControllerResolver.php | 2 ++ .../Controller/ControllerResolverTest.php | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php b/src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php index 4f80921cf5..e1da17388d 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php @@ -47,6 +47,8 @@ class ContainerControllerResolver extends ControllerResolver */ protected function instantiateController($class) { + $class = ltrim($class, '\\'); + if ($this->container->has($class)) { return $this->container->get($class); } diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php index 77ce524fc6..576ad76f03 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php @@ -38,6 +38,18 @@ class ControllerResolverTest extends TestCase $this->assertSame($lambda, $controller); } + public function testGetControllerWithStartingBackslash() + { + $resolver = $this->createControllerResolver(); + + $request = Request::create('/'); + $request->attributes->set('_controller', '\\'.ControllerTest::class.'::publicAction'); + $controller = $resolver->getController($request); + + $this->assertInstanceOf(ControllerTest::class, $controller[0]); + $this->assertSame('publicAction', $controller[1]); + } + public function testGetControllerWithObjectAndInvokeMethod() { $resolver = $this->createControllerResolver(); @@ -71,6 +83,17 @@ class ControllerResolverTest extends TestCase $this->assertSame('publicAction', $controller[1]); } + public function testGetControllerWithClassAndMethodAsArrayWithBackslash() + { + $resolver = $this->createControllerResolver(); + + $request = Request::create('/'); + $request->attributes->set('_controller', ['\\'.ControllerTest::class, 'publicAction']); + $controller = $resolver->getController($request); + $this->assertInstanceOf(ControllerTest::class, $controller[0]); + $this->assertSame('publicAction', $controller[1]); + } + public function testGetControllerWithClassAndMethodAsString() { $resolver = $this->createControllerResolver(); From 3c8d395d0d67e4475af37e77e0e53be6b47957bd Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 9 Aug 2019 13:42:40 +0200 Subject: [PATCH 2/2] [HttpKernel] fixed class having a leading \ in a route controller --- .../ContainerControllerResolverTest.php | 30 +++++++++++++++++++ .../Controller/ControllerResolverTest.php | 23 -------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ContainerControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ContainerControllerResolverTest.php index 842c84a224..956adb9613 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ContainerControllerResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ContainerControllerResolverTest.php @@ -119,6 +119,36 @@ class ContainerControllerResolverTest extends ControllerResolverTest $this->assertSame($service, $controller); } + /** + * @dataProvider getControllers + */ + public function testInstantiateControllerWhenControllerStartsWithABackslash($controller) + { + $service = new ControllerTestService('foo'); + $class = ControllerTestService::class; + + $container = $this->createMockContainer(); + $container->expects($this->once())->method('has')->with($class)->willReturn(true); + $container->expects($this->once())->method('get')->with($class)->willReturn($service); + + $resolver = $this->createControllerResolver(null, $container); + $request = Request::create('/'); + $request->attributes->set('_controller', $controller); + + $controller = $resolver->getController($request); + + $this->assertInstanceOf(ControllerTestService::class, $controller[0]); + $this->assertSame('action', $controller[1]); + } + + public function getControllers() + { + return [ + ['\\'.ControllerTestService::class.'::action'], + ['\\'.ControllerTestService::class.':action'], + ]; + } + public function testExceptionWhenUsingRemovedControllerServiceWithClassNameAsName() { $this->expectException('InvalidArgumentException'); diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php index 576ad76f03..77ce524fc6 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php @@ -38,18 +38,6 @@ class ControllerResolverTest extends TestCase $this->assertSame($lambda, $controller); } - public function testGetControllerWithStartingBackslash() - { - $resolver = $this->createControllerResolver(); - - $request = Request::create('/'); - $request->attributes->set('_controller', '\\'.ControllerTest::class.'::publicAction'); - $controller = $resolver->getController($request); - - $this->assertInstanceOf(ControllerTest::class, $controller[0]); - $this->assertSame('publicAction', $controller[1]); - } - public function testGetControllerWithObjectAndInvokeMethod() { $resolver = $this->createControllerResolver(); @@ -83,17 +71,6 @@ class ControllerResolverTest extends TestCase $this->assertSame('publicAction', $controller[1]); } - public function testGetControllerWithClassAndMethodAsArrayWithBackslash() - { - $resolver = $this->createControllerResolver(); - - $request = Request::create('/'); - $request->attributes->set('_controller', ['\\'.ControllerTest::class, 'publicAction']); - $controller = $resolver->getController($request); - $this->assertInstanceOf(ControllerTest::class, $controller[0]); - $this->assertSame('publicAction', $controller[1]); - } - public function testGetControllerWithClassAndMethodAsString() { $resolver = $this->createControllerResolver();