Как вызывать другие команды

Как вызывать другие команды

Если команда зависит от другой, которая выполняется ранее, вместо того, чтобы просить пользователя запомнить порядок выполнения, вы можете вызвать её напрямую самостоятельно. Это также полезно, если вы хотите создать "мета" команду, которая просто запускать кучу других команд (например, все команды, которые нужно выполнить, когда код проекта был изменён на серверах разработки: очистка кеша, генерирование прокси Doctrine2 proxies, сброс веб-ресурсов, ...).

Вызов команды из другой команды очень прямолинеен:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\Console\Input\ArrayInput;
// ...

protected function execute(InputInterface $input, OutputInterface $output)
{
    $command = $this->getApplication()->find('demo:greet');

    $arguments = array(
        'command' => 'demo:greet',
        'name'    => 'Fabien',
        '--yell'  => true,
    );

    $greetInput = new ArrayInput($arguments);
    $returnCode = $command->run($greetInput, $output);

    // ...
}

Для начала, вы find() команду, которую вы хотите выполнить, передав имя команды. Потом, вам нужно создать новый ArrayInput с аргументами и опциями, которые вы хотите передать команде.

Наконец, вызов метода run() действительно выполняет команду и возвращает возвращённый из команды код (возвратное значение из метода команды execute()).

Tip

Если вы хотите сдержать вывод выполненной команды, передайте NullOutput в качестве второго аргумента $command->run().

Caution

Отметьте, что все команды будут выполнены в одном процессе и некоторые встроенные команды Symfony могут так не очень хорошо работать. Например, команды cache:clear и cache:warmup изменяют некоторые определения класса, так что выполенение чего- либо после них, скорее всего, не удастся.

Note

В большинстве случаев, вызов команды из кода, который не выполняется в командной строке, - это плоха идея. Главной причиной является то, что вывод команды оптимизирован для консоли, а не для передачи другим командам.