How to Call Other Commands

If a command depends on another one being run before it you can call in the console command itself. This is useful if a command depends on another command or if you want to create a "meta" command that runs a bunch of other commands (for instance, all commands that need to be run when the project's code has changed on the production servers: clearing the cache, generating Doctrine proxies, dumping web assets, ...).

コマンドがその前に実行されている別のコマンドに依存している場合は、コンソール コマンド自体を呼び出すことができます。これは、コマンドが別のコマンドに依存している場合、または他のコマンドの束を実行する「メタ」コマンドを作成する場合 (たとえば、プロジェクトのコードが運用サーバーで変更されたときに実行する必要があるすべてのコマンド) に役立ちます。キャッシュ、Doctrineproxy の生成、Web アセットのダンプなど)。

Use the find() method to find the command you want to run by passing the command name. Then, create a new ArrayInput with the arguments and options you want to pass to the command.

find() メソッドを使用して、コマンド名を渡して実行するコマンドを見つけます。次に、コマンドに渡す引数とオプションを使用して、新しい ArrayInput を作成します。

Eventually, calling the run() method actually runs the command and returns the returned code from the command (return value from command's execute() method):

最終的に、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

ヒント

If you want to suppress the output of the executed command, pass a NullOutput as the second argument to $command->run().

実行されたコマンドの出力を抑制したい場合は、aNullOutput を $command->run() の 2 番目の引数として渡します。

Caution

注意

Note that all the commands will run in the same process and some of Symfony's built-in commands may not work well this way. For instance, the cache:clear and cache:warmup commands change some class definitions, so running something after them is likely to break.

すべてのコマンドは同じプロセスで実行され、Symfony の組み込みコマンドの一部はこの方法ではうまく機能しない可能性があることに注意してください。たとえば、cache:clear および cache:warmup コマンドはいくつかのクラス定義を変更するため、それらの後に何かを実行すると壊れる可能性があります。

Note

ノート

Most of the times, calling a command from code that is not executed on the command line is not a good idea. The main reason is that the command's output is optimized for the console and not to be passed to other commands.

ほとんどの場合、コマンド ラインで実行されないコードからコマンドを呼び出すことはお勧めできません。主な理由は、コマンドの出力がコンソール用に最適化されており、他のコマンドに渡されないためです。