Seditio Source
Root |
./othercms/xenForo 2.2.8/src/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php
<?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);
    }
}