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

Breadcrumb

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

function Application::find

Finds a command by name or alias.

Contrary to get, this command tries to find the best match if you give it an abbreviation of a name or alias.

Throws

CommandNotFoundException When command name is incorrect or ambiguous

3 calls to Application::find()
Application::doRun in vendor/composer/composer/src/Composer/Console/Application.php
Runs the current application.
Application::doRun in vendor/symfony/console/Application.php
Runs the current application.
Application::setDefaultCommand in vendor/symfony/console/Application.php
Sets the default Command name.

File

vendor/symfony/console/Application.php, line 679

Class

Application
An Application is the container for a collection of commands.

Namespace

Symfony\Component\Console

Code

public function find(string $name) : Command {
    $this->init();
    $aliases = [];
    foreach ($this->commands as $command) {
        foreach ($command->getAliases() as $alias) {
            if (!$this->has($alias)) {
                $this->commands[$alias] = $command;
            }
        }
    }
    if ($this->has($name)) {
        return $this->get($name);
    }
    $allCommands = $this->commandLoader ? array_merge($this->commandLoader
        ->getNames(), array_keys($this->commands)) : array_keys($this->commands);
    $expr = implode('[^:]*:', array_map('preg_quote', explode(':', $name))) . '[^:]*';
    $commands = preg_grep('{^' . $expr . '}', $allCommands);
    if (!$commands) {
        $commands = preg_grep('{^' . $expr . '}i', $allCommands);
    }
    // if no commands matched or we just matched namespaces
    if (!$commands || \count(preg_grep('{^' . $expr . '$}i', $commands)) < 1) {
        if (false !== ($pos = strrpos($name, ':'))) {
            // check if a namespace exists and contains commands
            $this->findNamespace(substr($name, 0, $pos));
        }
        $message = \sprintf('Command "%s" is not defined.', $name);
        if ($alternatives = $this->findAlternatives($name, $allCommands)) {
            // remove hidden commands
            $alternatives = array_filter($alternatives, fn($name) => !$this->get($name)
                ->isHidden());
            if (1 == \count($alternatives)) {
                $message .= "\n\nDid you mean this?\n    ";
            }
            else {
                $message .= "\n\nDid you mean one of these?\n    ";
            }
            $message .= implode("\n    ", $alternatives);
        }
        throw new CommandNotFoundException($message, array_values($alternatives));
    }
    // filter out aliases for commands which are already on the list
    if (\count($commands) > 1) {
        $commandList = $this->commandLoader ? array_merge(array_flip($this->commandLoader
            ->getNames()), $this->commands) : $this->commands;
        $commands = array_unique(array_filter($commands, function ($nameOrAlias) use (&$commandList, $commands, &$aliases) {
            if (!$commandList[$nameOrAlias] instanceof Command) {
                $commandList[$nameOrAlias] = $this->commandLoader
                    ->get($nameOrAlias);
            }
            $commandName = $commandList[$nameOrAlias]->getName();
            $aliases[$nameOrAlias] = $commandName;
            return $commandName === $nameOrAlias || !\in_array($commandName, $commands, true);
        }));
    }
    if (\count($commands) > 1) {
        $usableWidth = $this->terminal
            ->getWidth() - 10;
        $abbrevs = array_values($commands);
        $maxLen = 0;
        foreach ($abbrevs as $abbrev) {
            $maxLen = max(Helper::width($abbrev), $maxLen);
        }
        $abbrevs = array_map(function ($cmd) use ($commandList, $usableWidth, $maxLen, &$commands) {
            if ($commandList[$cmd]->isHidden()) {
                unset($commands[array_search($cmd, $commands)]);
                return false;
            }
            $abbrev = str_pad($cmd, $maxLen, ' ') . ' ' . $commandList[$cmd]->getDescription();
            return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3) . '...' : $abbrev;
        }, array_values($commands));
        if (\count($commands) > 1) {
            $suggestions = $this->getAbbreviationSuggestions(array_filter($abbrevs));
            throw new CommandNotFoundException(\sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), array_values($commands));
        }
    }
    $command = $this->get(reset($commands));
    if ($command->isHidden()) {
        throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name));
    }
    return $command;
}

API Navigation

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