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

Дата обновления перевода 2024-07-16

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

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

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

В конечном итоге, вызов метода run() фактически запускает команду и возвращает возвращаемый код команды (возвращаемое значение из метода команды execute()):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// ...
use Symfony\Component\Console\Command;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class CreateUserCommand extends Command
{
    // ...

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $greetInput = new ArrayInput([
            // имя команды передается в качестве первого аргумента
            'command' => 'demo:greet',
            'name'    => 'Fabien',
            '--yell'  => true,
        ]);

        $returnCode = $this->getApplication()->doRun($greetInput, $output);

        // ...
    }
}

Tip

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

Note

Использование doRun() вместо run() предотвращает автовыход и позволяет
возвращать код выхода.

Кроме того, использование $this->getApplication()->doRun() вместо $this->getApplication()->find('demo:greet')->run() позволит надлежащим образом разворачивать события и для этой внутренней команды.

Caution

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

Note

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