From 6c1b384b751d31d14dbe70cb702980ec4d17b719 Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Sat, 29 Apr 2017 11:02:54 +0200 Subject: [PATCH] Avoid reflection-based registration for command public services --- .../Compiler/AddConsoleCommandPassTest.php | 2 +- .../DependencyInjection/AddConsoleCommandPass.php | 14 +++++++------- .../AddConsoleCommandPassTest.php | 2 +- src/Symfony/Component/HttpKernel/Bundle/Bundle.php | 3 ++- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConsoleCommandPassTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConsoleCommandPassTest.php index bc9fc58d45baa..58a0da41c3d91 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConsoleCommandPassTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/AddConsoleCommandPassTest.php @@ -53,7 +53,7 @@ public function testProcess($public) } $this->assertTrue($container->hasParameter('console.command.ids')); - $this->assertSame(array($id), $container->getParameter('console.command.ids')); + $this->assertSame(array($alias => $id), $container->getParameter('console.command.ids')); } public function visibilityProvider() diff --git a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php index 46795949d39a1..d0626be16b2cf 100644 --- a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php +++ b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php @@ -39,16 +39,16 @@ public function process(ContainerBuilder $container) throw new InvalidArgumentException(sprintf('The service "%s" tagged "console.command" must be a subclass of "%s".', $id, Command::class)); } + $commandId = 'console.command.'.strtolower(str_replace('\\', '_', $class)); + if ($container->hasAlias($commandId) || isset($serviceIds[$commandId])) { + $commandId = $commandId.'_'.$id; + } if (!$definition->isPublic()) { - $serviceId = 'console.command.'.strtolower(str_replace('\\', '_', $class)); - if ($container->hasAlias($serviceId)) { - $serviceId = $serviceId.'_'.$id; - } - $container->setAlias($serviceId, $id); - $id = $serviceId; + $container->setAlias($commandId, $id); + $id = $commandId; } - $serviceIds[] = $id; + $serviceIds[$commandId] = $id; } $container->setParameter('console.command.ids', $serviceIds); diff --git a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php index f5f814e7c4845..0cf4631754522 100644 --- a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +++ b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php @@ -50,7 +50,7 @@ public function testProcess($public) } $this->assertTrue($container->hasParameter('console.command.ids')); - $this->assertSame(array($id), $container->getParameter('console.command.ids')); + $this->assertSame(array($alias => $id), $container->getParameter('console.command.ids')); } public function visibilityProvider() diff --git a/src/Symfony/Component/HttpKernel/Bundle/Bundle.php b/src/Symfony/Component/HttpKernel/Bundle/Bundle.php index 8505bbbddd3f0..bd71b6e8d5361 100644 --- a/src/Symfony/Component/HttpKernel/Bundle/Bundle.php +++ b/src/Symfony/Component/HttpKernel/Bundle/Bundle.php @@ -183,8 +183,9 @@ public function registerCommands(Application $application) } $class = $ns.'\\'.$file->getBasename('.php'); if ($this->container) { + $commandIds = $this->container->hasParameter('console.command.ids') ? $this->container->getParameter('console.command.ids') : array(); $alias = 'console.command.'.strtolower(str_replace('\\', '_', $class)); - if ($this->container->has($alias)) { + if (isset($commandIds[$alias]) || $this->container->has($alias)) { continue; } }