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

Если консольная команда в Symfony зависит от другой команды, выполняемой перед ней, то вместо того, чтобы просить пользователя запомнить порядок выполнения, вы можете вызвать ее непосредственно самостоятельно.

Это также полезно, если вы хотите создать «мета»-команду, которая просто запускает множество других команд (например, все команды, которые необходимо выполнить, когда код проекта был изменен на производственных серверах: очистка кэша, генерация Doctrine2, дампы веб-ресурсов и т.д.).

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

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
// ...

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

    $arguments = [
        'command' => 'demo:greet',
        'name'    => 'Fabien',
        '--yell'  => true,
    ];

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

    // ...
}

Сначала вы находите нужную для выполнения консольную команду, которую хотите выполнить, передавая имя команды в метод в специальный метод $this->getApplication()->find(‘demo:great’). Затем вам нужно создать новый объект new ArrayInput с аргументами и параметрами, которые вы хотите передать команде.

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован.