Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. AddConsoleCommandPass.php

function AddConsoleCommandPass::process

Overrides CompilerPassInterface::process

File

vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php, line 32

Class

AddConsoleCommandPass
Registers console commands.

Namespace

Symfony\Component\Console\DependencyInjection

Code

public function process(ContainerBuilder $container) : void {
    $commandServices = $container->findTaggedServiceIds('console.command', true);
    $lazyCommandMap = [];
    $lazyCommandRefs = [];
    $serviceIds = [];
    foreach ($commandServices as $id => $tags) {
        $definition = $container->getDefinition($id);
        $definition->addTag('container.no_preload');
        $class = $container->getParameterBag()
            ->resolveValue($definition->getClass());
        if (isset($tags[0]['command'])) {
            $aliases = $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, 'console.command', Command::class));
            }
            $aliases = str_replace('%', '%%', $class::getDefaultName() ?? '');
        }
        $aliases = explode('|', $aliases);
        $commandName = array_shift($aliases);
        if ($isHidden = '' === $commandName) {
            $commandName = array_shift($aliases);
        }
        if (null === $commandName) {
            if (!$definition->isPublic() || $definition->isPrivate() || $definition->hasTag('container.private')) {
                $commandId = 'console.command.public_alias.' . $id;
                $container->setAlias($commandId, $id)
                    ->setPublic(true);
                $id = $commandId;
            }
            $serviceIds[] = $id;
            continue;
        }
        $description = $tags[0]['description'] ?? null;
        unset($tags[0]);
        $lazyCommandMap[$commandName] = $id;
        $lazyCommandRefs[$id] = new TypedReference($id, $class);
        foreach ($aliases as $alias) {
            $lazyCommandMap[$alias] = $id;
        }
        foreach ($tags as $tag) {
            if (isset($tag['command'])) {
                $aliases[] = $tag['command'];
                $lazyCommandMap[$tag['command']] = $id;
            }
            $description ??= $tag['description'] ?? null;
        }
        $definition->addMethodCall('setName', [
            $commandName,
        ]);
        if ($aliases) {
            $definition->addMethodCall('setAliases', [
                $aliases,
            ]);
        }
        if ($isHidden) {
            $definition->addMethodCall('setHidden', [
                true,
            ]);
        }
        if (!$description) {
            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, 'console.command', Command::class));
            }
            $description = str_replace('%', '%%', $class::getDefaultDescription() ?? '');
        }
        if ($description) {
            $definition->addMethodCall('setDescription', [
                $description,
            ]);
            $container->register('.' . $id . '.lazy', LazyCommand::class)
                ->setArguments([
                $commandName,
                $aliases,
                $description,
                $isHidden,
                new ServiceClosureArgument($lazyCommandRefs[$id]),
            ]);
            $lazyCommandRefs[$id] = new Reference('.' . $id . '.lazy');
        }
    }
    $container->register('console.command_loader', ContainerCommandLoader::class)
        ->setPublic(true)
        ->addTag('container.no_preload')
        ->setArguments([
        ServiceLocatorTagPass::register($container, $lazyCommandRefs),
        $lazyCommandMap,
    ]);
    $container->setParameter('console.command.ids', $serviceIds);
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal