| 
<?php
 /*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 namespace Symfony\Component\Console\DependencyInjection;
 
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
 
 /**
 * Registers console commands.
 *
 * @author Grégoire Pineau <[email protected]>
 */
 class AddConsoleCommandPass implements CompilerPassInterface
 {
 public function process(ContainerBuilder $container)
 {
 $commandServices = $container->findTaggedServiceIds('console.command', true);
 $serviceIds = array();
 
 foreach ($commandServices as $id => $tags) {
 $definition = $container->getDefinition($id);
 $class = $container->getParameterBag()->resolveValue($definition->getClass());
 
 if (!$r = $container->getReflectionClass($class)) {
 throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
 }
 if (!$r->isSubclassOf(Command::class)) {
 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()) {
 $container->setAlias($commandId, $id);
 $id = $commandId;
 }
 
 $serviceIds[$commandId] = $id;
 }
 
 $container->setParameter('console.command.ids', $serviceIds);
 }
 }
 
 |