| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * 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\Console\CommandLoader\ContainerCommandLoader;use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;use Symfony\Component\DependencyInjection\ContainerBuilder;use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;use Symfony\Component\DependencyInjection\TypedReference;/** * Registers console commands. * * @author Grégoire Pineau <lyrixx@lyrixx.info> */class AddConsoleCommandPass implements CompilerPassInterface{    private $commandLoaderServiceId;    private $commandTag;    public function __construct($commandLoaderServiceId = 'console.command_loader', $commandTag = 'console.command')    {        $this->commandLoaderServiceId = $commandLoaderServiceId;        $this->commandTag = $commandTag;    }    public function process(ContainerBuilder $container)    {        $commandServices = $container->findTaggedServiceIds($this->commandTag, true);        $lazyCommandMap = [];        $lazyCommandRefs = [];        $serviceIds = [];        $lazyServiceIds = [];        foreach ($commandServices as $id => $tags) {            $definition = $container->getDefinition($id);            $class = $container->getParameterBag()->resolveValue($definition->getClass());            $commandId = 'console.command.'.strtolower(str_replace('\\', '_', $class));            if (isset($tags[0]['command'])) {                $commandName = $tags[0]['command'];            } else {                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 "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class));                }                $commandName = $class::getDefaultName();            }            if (null === $commandName) {                if (isset($serviceIds[$commandId]) || $container->hasAlias($commandId)) {                    $commandId = $commandId.'_'.$id;                }                if (!$definition->isPublic() || $definition->isPrivate()) {                    $container->setAlias($commandId, $id)->setPublic(true);                    $id = $commandId;                }                $serviceIds[$commandId] = $id;                continue;            }            $serviceIds[$commandId] = $id;            $lazyServiceIds[$id] = true;            unset($tags[0]);            $lazyCommandMap[$commandName] = $id;            $lazyCommandRefs[$id] = new TypedReference($id, $class);            $aliases = [];            foreach ($tags as $tag) {                if (isset($tag['command'])) {                    $aliases[] = $tag['command'];                    $lazyCommandMap[$tag['command']] = $id;                }            }            $definition->addMethodCall('setName', [$commandName]);            if ($aliases) {                $definition->addMethodCall('setAliases', [$aliases]);            }        }        $container            ->register($this->commandLoaderServiceId, ContainerCommandLoader::class)            ->setPublic(true)            ->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]);        $container->setParameter('console.command.ids', $serviceIds);        $container->setParameter('console.lazy_command.ids', $lazyServiceIds);    }}
 |