Avoid reflection-based registration for command public services

This commit is contained in:
Robin Chalas 2017-04-29 11:02:54 +02:00
parent f8133cbd4e
commit 6c1b384b75
4 changed files with 11 additions and 10 deletions

View File

@ -53,7 +53,7 @@ class AddConsoleCommandPassTest extends TestCase
}
$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()

View File

@ -39,16 +39,16 @@ class AddConsoleCommandPass implements CompilerPassInterface
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);

View File

@ -50,7 +50,7 @@ class AddConsoleCommandPassTest extends TestCase
}
$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()

View File

@ -183,8 +183,9 @@ abstract class Bundle implements BundleInterface
}
$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;
}
}