Як викликати інші команди

Дата оновлення перекладу 2022-11-19

Як викликати інші команди

Якщо команда залежить від іншої, яка виконується раніше, замість того, щоб просити користувача запамʼятати порядок виконання, ви можете викликати її напряму самостійно. Це також корисно, якщо ви хочете створити "мета" команду, яка просто запускає купу інших команд (наприклад, всі команди, які потрібно виконати, коли код проекту був змінений на серверах розробки: очищення кешу, генерування проксі Doctrine2, скидання веб-ресурсів, ...).

Використайте метод 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
25
// ...
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): void
    {
        $command = $this->getApplication()->find('demo:greet');

        $arguments = [
            'name'    => 'Fabien',
            '--yell'  => true,
        ];

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

        // ...
    }
}

Tip

Якщо ви хочете стримати виведення виконаної команди, передайте NullOutput в якості другого аргументу $command->run().

Caution

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

Note

У більшості випадків, виклик команди з коду, який не виконується у командному рядку, - це погана ідея. Головною причиною є те, що виведення команди оптимізоване для консолі, а не для передачі іншим командам.