Console Commands

The Symfony framework provides lots of commands through the bin/console script (e.g. the well-known bin/console cache:clear command). These commands are created with the Console component. You can also use it to create your own commands.

Symfony フレームワークは、bin/console スクリプト (よく知られている bin/console cache:clear コマンドなど) を通じて多くのコマンドを提供します。これらのコマンドは、コンソール コンポーネントで作成されます。これを使用して、独自のコマンドを作成することもできます。

Running Commands

Each Symfony application comes with a large set of commands. You can use the list command to view all available commands in the application:

各 Symfony アプリケーションには、多数のコマンド セットが付属しています。 list コマンドを使用して、アプリケーションで使用可能なすべてのコマンドを表示できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
$ php bin/console list
...

Available commands:
  about                                      Display information about the current project
  completion                                 Dump the shell completion script
  help                                       Display help for a command
  list                                       List commands
 assets
  assets:install                             Install bundle's web assets under a public directory
 cache
  cache:clear                                Clear the cache
...

If you find the command you need, you can run it with the --help option to view the command's documentation:

必要なコマンドが見つかったら、 --help オプションを指定して実行し、コマンドのドキュメントを表示できます。
1
$ php bin/console assets:install --help

APP_ENV & APP_DEBUG

Console commands run in the environment defined in the APP_ENV variable of the .env file, which is dev by default. It also reads the APP_DEBUG value to turn "debug" mode on or off (it defaults to 1, which is on).

コンソール コマンドは、デフォルトで dev である .env ファイルの APP_ENVvariable で定義された環境で実行されます。また、APP_DEBUG 値を読み取って、「デバッグ」モードをオンまたはオフにします (デフォルトは 1 で、オンになっています)。

To run the command in another environment or debug mode, edit the value of APP_ENV and APP_DEBUG. You can also define this env vars when running the command, for instance:

別の環境またはデバッグ モードでコマンドを実行するには、APP_ENV および APP_DEBUG の値を編集します。コマンドを実行するときに、この環境変数を定義することもできます。たとえば、次のようになります。
1
2
# clears the cache for the prod environment
$ APP_ENV=prod php bin/console cache:clear

Console Completion

6.1

6.1

Console completion for Fish was introduced in Symfony 6.1.

Fish のコンソール補完は Symfony 6.1 で導入されました。

6.2

6.2

Console completion for Zsh was introduced in Symfony 6.2.

Zsh のコンソール補完は Symfony 6.2 で導入されました。

If you are using the Bash, Zsh or Fish shell, you can install Symfony's completion script to get auto completion when typing commands in the terminal. All commands support name and option completion, and some can even complete values.

Bash、Zsh、または Fish シェルを使用している場合は、Symfony の補完スクリプトをインストールして、ターミナルでコマンドを入力するときにオートコンプリートを取得できます。すべてのコマンドは名前とオプションの補完をサポートしており、一部のコマンドは値を補完することさえできます。

First, you have to install the completion script once. Run bin/console completion --help for the installation instructions for your shell.

まず、完了スクリプトを一度インストールする必要があります。シェルのインストール手順については、ランビン/コンソールの完了 --help を参照してください。

Note

ノート

When using Bash, make sure you installed and setup the "bash completion" package for your OS (typically named bash-completion).

Bash を使用する場合は、OS の「bash 補完」パッケージ (通常は bash-completion という名前) がインストールされ、セットアップされていることを確認してください。

After installing and restarting your terminal, you're all set to use completion (by default, by pressing the Tab key).

端末をインストールして再起動すると、補完を使用する準備が整います (デフォルトでは、Tab キーを押します)。

Tip

ヒント

Many PHP tools are built using the Symfony Console component (e.g. Composer, PHPstan and Behat). If they are using version 5.4 or higher, you can also install their completion script to enable console completion:

多くの PHP ツールは、Symfony コンソール コンポーネント (Composer、PHPstan、Behat など) を使用して構築されています。バージョン 5.4 以降を使用している場合は、完了スクリプトをインストールして、コンソールの完了を有効にすることもできます。
1
2
$ php vendor/bin/phpstan completion --help
$ composer completion --help

Creating a Command

Commands are defined in classes extending Command. For example, you may want a command to create a user:

コマンドはクラス extendsCommand で定義されます。たとえば、ユーザーを作成するコマンドが必要な場合があります。
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
26
27
28
29
30
31
32
// src/Command/CreateUserCommand.php
namespace App\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

// the name of the command is what users type after "php bin/console"
#[AsCommand(name: 'app:create-user')]
class CreateUserCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        // ... put here the code to create the user

        // this method must return an integer number with the "exit status code"
        // of the command. You can also use these constants to make code more readable

        // return this if there was no problem running the command
        // (it's equivalent to returning int(0))
        return Command::SUCCESS;

        // or return this if some error happened during the execution
        // (it's equivalent to returning int(1))
        // return Command::FAILURE;

        // or return this to indicate incorrect command usage; e.g. invalid options
        // or missing arguments (it's equivalent to returning int(2))
        // return Command::INVALID
    }
}

Configuring the Command

You can optionally define a description, help message and the input options and arguments by overriding the configure() method:

オプションで、configure() メソッドをオーバーライドすることで、説明、ヘルプ メッセージ、および入力オプションと引数を定義できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// src/Command/CreateUserCommand.php

// ...
class CreateUserCommand extends Command
{
    // the command description shown when running "php bin/console list"
    protected static $defaultDescription = 'Creates a new user.';

    // ...
    protected function configure(): void
    {
        $this
            // the command help shown when running the command with the "--help" option
            ->setHelp('This command allows you to create a user...')
        ;
    }
}

Tip

ヒント

Defining the $defaultDescription static property instead of using the setDescription() method allows to get the command description without instantiating its class. This makes the php bin/console list command run much faster.

setDescription() メソッドを使用する代わりに $defaultDescription 静的プロパティを定義すると、そのクラスをインスタンス化せずにコマンドの説明を取得できます。これにより、php bin/console list コマンドの実行が大幅に高速化されます。

If you want to always run the list command fast, add the --short option to it (php bin/console list --short). This will avoid instantiating command classes, but it won't show any description for commands that use the setDescription() method instead of the static property.

list コマンドを常に高速に実行したい場合は、 --short オプションを追加します (php bin/console list --short)。これによりコマンドクラスのインスタンス化は回避されますが、静的プロパティの代わりに setDescription() メソッドを使用するコマンドの説明は表示されません。

The configure() method is called automatically at the end of the command constructor. If your command defines its own constructor, set the properties first and then call to the parent constructor, to make those properties available in the configure() method:

configure() メソッドは、コマンド コンストラクターの最後で自動的に呼び出されます。コマンドが独自のコンストラクターを定義する場合は、最初にプロパティを設定してから親コンストラクターを呼び出して、それらのプロパティを configure() メソッドで使用できるようにします。
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
26
// ...
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;

class CreateUserCommand extends Command
{
    // ...

    public function __construct(bool $requirePassword = false)
    {
        // best practices recommend to call the parent constructor first and
        // then set your own properties. That wouldn't work in this case
        // because configure() needs the properties set in this constructor
        $this->requirePassword = $requirePassword;

        parent::__construct();
    }

    protected function configure(): void
    {
        $this
            // ...
            ->addArgument('password', $this->requirePassword ? InputArgument::REQUIRED : InputArgument::OPTIONAL, 'User password')
        ;
    }
}

Registering the Command

In PHP 8 and newer versions, you can register the command by adding the AsCommand attribute to it:

PHP 8 以降のバージョンでは、コマンドに AsCommand 属性を追加することでコマンドを登録できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Command/CreateUserCommand.php
namespace App\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;

// the "name" and "description" arguments of AsCommand replace the
// static $defaultName and $defaultDescription properties
#[AsCommand(
    name: 'app:create-user',
    description: 'Creates a new user.',
    hidden: false,
    aliases: ['app:add-user']
)]
class CreateUserCommand extends Command
{
    // ...
}

If you can't use PHP attributes, register the command as a service and tag it with the console.command tag. If you're using the default services.yaml configuration, this is already done for you, thanks to autoconfiguration.

PHP 属性を使用できない場合は、コマンドをサービスとして登録し、console.command タグでタグ付けします。デフォルトの services.yaml 構成を使用している場合、自動構成のおかげで、これは既に行われています。

Running the Command

After configuring and registering the command, you can run it in the terminal:

コマンドを構成して登録したら、ターミナルで実行できます。
1
$ php bin/console app:create-user

As you might expect, this command will do nothing as you didn't write any logic yet. Add your own logic inside the execute() method.

ご想像のとおり、まだロジックを記述していないため、このコマンドは何も実行しません。 execute() メソッド内に独自のロジックを追加します。

Console Output

The execute() method has access to the output stream to write messages to the console:

execute() メソッドは、コンソールにメッセージを書き込むために出力ストリームにアクセスできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ...
protected function execute(InputInterface $input, OutputInterface $output): int
{
    // outputs multiple lines to the console (adding "\n" at the end of each line)
    $output->writeln([
        'User Creator',
        '============',
        '',
    ]);

    // the value returned by someMethod() can be an iterator (https://php.net/iterator)
    // that generates and returns the messages with the 'yield' PHP keyword
    $output->writeln($this->someMethod());

    // outputs a message followed by a "\n"
    $output->writeln('Whoa!');

    // outputs a message without adding a "\n" at the end of the line
    $output->write('You are about to ');
    $output->write('create a user.');

    return Command::SUCCESS;
}

Now, try executing the command:

では、次のコマンドを実行してみてください。
1
2
3
4
5
6
$ php bin/console app:create-user
User Creator
============

Whoa!
You are about to create a user.

Output Sections

The regular console output can be divided into multiple independent regions called "output sections". Create one or more of these sections when you need to clear and overwrite the output information.

通常のコンソール出力は、「出力セクション」と呼ばれる複数の独立した領域に分割できます。出力情報をクリアして上書きする必要がある場合は、これらのセクションを 1 つ以上作成します。

Sections are created with the ConsoleOutput::section() method, which returns an instance of ConsoleSectionOutput:

セクションは、ConsoleOutput::section() メソッドで作成されます。このメソッドは、ConsoleSectionOutput のインスタンスを返します。
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// ...
use Symfony\Component\Console\Output\ConsoleOutputInterface;

class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        if (!$output instanceof ConsoleOutputInterface) {
            throw new \LogicException('This command accepts only an instance of "ConsoleOutputInterface".');
        }

        $section1 = $output->section();
        $section2 = $output->section();

        $section1->writeln('Hello');
        $section2->writeln('World!');
        // Output displays "Hello\nWorld!\n"

        // overwrite() replaces all the existing section contents with the given content
        $section1->overwrite('Goodbye');
        // Output now displays "Goodbye\nWorld!\n"

        // clear() deletes all the section contents...
        $section2->clear();
        // Output now displays "Goodbye\n"

        // ...but you can also delete a given number of lines
        // (this example deletes the last two lines of the section)
        $section1->clear(2);
        // Output is now completely empty!

        // setting the max height of a section will make new lines replace the old ones
        $section1->setMaxHeight(2);
        $section1->writeln('Line1');
        $section1->writeln('Line2');
        $section1->writeln('Line3');

        return Command::SUCCESS;
    }
}

Note

ノート

A new line is appended automatically when displaying information in a section.

セクションに情報を表示すると、自動的に改行が追加されます。

6.2

6.2

The feature to limit the height of a console section was introduced in Symfony 6.2.

コンソール セクションの高さを制限する機能は、Symfony 6.2 で導入されました。

Output sections let you manipulate the Console output in advanced ways, such as displaying multiple progress bars which are updated independently and appending rows to tables that have already been rendered.

出力セクションを使用すると、独立して更新される複数のプログレス バーを表示したり、既にレンダリングされたテーブルに行を追加したりするなど、高度な方法でコンソール出力を操作できます。

Console Input

Use input options or arguments to pass information to the command:

入力オプションまたは引数を使用して、情報をコマンドに渡します。
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
26
use Symfony\Component\Console\Input\InputArgument;

// ...
protected function configure(): void
{
    $this
        // configure an argument
        ->addArgument('username', InputArgument::REQUIRED, 'The username of the user.')
        // ...
    ;
}

// ...
public function execute(InputInterface $input, OutputInterface $output): int
{
    $output->writeln([
        'User Creator',
        '============',
        '',
    ]);

    // retrieve the argument value using getArgument()
    $output->writeln('Username: '.$input->getArgument('username'));

    return Command::SUCCESS;
}

Now, you can pass the username to the command:

これで、ユーザー名をコマンドに渡すことができます:
1
2
3
4
5
$ php bin/console app:create-user Wouter
User Creator
============

Username: Wouter

See also

こちらもご覧ください

Read Console Input (Arguments & Options) for more information about console options and arguments.

コンソールのオプションと引数の詳細については、コンソール入力 (引数とオプション) を参照してください。

Getting Services from the Service Container

To actually create a new user, the command has to access some services. Since your command is already registered as a service, you can use normal dependency injection. Imagine you have a App\Service\UserManager service that you want to access:

実際に新しいユーザーを作成するには、コマンドがいくつかのサービスにアクセスする必要があります。コマンドは既にサービスとして登録されているため、通常の依存性注入を使用できます。アクセスしたい App\Service\UserManager サービスがあるとします。
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
26
27
28
// ...
use App\Service\UserManager;
use Symfony\Component\Console\Command\Command;

class CreateUserCommand extends Command
{
    private $userManager;

    public function __construct(UserManager $userManager)
    {
        $this->userManager = $userManager;

        parent::__construct();
    }

    // ...

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        // ...

        $this->userManager->create($input->getArgument('username'));

        $output->writeln('User successfully generated!');

        return Command::SUCCESS;
    }
}

Command Lifecycle

Commands have three lifecycle methods that are invoked when running the command:

コマンドには、コマンドの実行時に呼び出される 3 つのライフサイクル メソッドがあります。
initialize() (optional)
This method is executed before the interact() and the execute() methods. Its main purpose is to initialize variables used in the rest of the command methods.
このメソッドは、interact() および execute() メソッドの前に実行されます。その主な目的は、残りのコマンド メソッドで使用される変数を初期化することです。
interact() (optional)
This method is executed after initialize() and before execute(). Its purpose is to check if some of the options/arguments are missing and interactively ask the user for those values. This is the last place where you can ask for missing options/arguments. After this command, missing options/arguments will result in an error.
このメソッドは、initialize() の後、execute() の前に実行されます。その目的は、オプション/引数の一部が欠落しているかどうかを確認し、対話的にユーザーにそれらの値を尋ねることです。これは、不足しているオプション/引数を尋ねることができる最後の場所です。このコマンドの後に、オプション/引数がないとエラーになります。
execute() (required)
This method is executed after interact() and initialize(). It contains the logic you want the command to execute and it must return an integer which will be used as the command exit status.
このメソッドは、interact() および initialize() の後に実行されます。コマンドで実行するロジックが含まれており、コマンドの終了ステータスとして使用される整数を返す必要があります。

Testing Commands

Symfony provides several tools to help you test your commands. The most useful one is the CommandTester class. It uses special input and output classes to ease testing without a real console:

symfony は、コマンドをテストするのに役立ついくつかのツールを提供します。最も役立つのは CommandTester クラスです。特別な入力および出力クラスを使用して、実際のコンソールなしでテストを容易にします。
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
26
27
28
29
30
31
32
33
34
35
// tests/Command/CreateUserCommandTest.php
namespace App\Tests\Command;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;

class CreateUserCommandTest extends KernelTestCase
{
    public function testExecute()
    {
        $kernel = self::bootKernel();
        $application = new Application($kernel);

        $command = $application->find('app:create-user');
        $commandTester = new CommandTester($command);
        $commandTester->execute([
            // pass arguments to the helper
            'username' => 'Wouter',

            // prefix the key with two dashes when passing options,
            // e.g: '--some-option' => 'option_value',
            // use brackets for testing array value,
            // e.g: '--some-option' => ['option_value'],
        ]);

        $commandTester->assertCommandIsSuccessful();

        // the output of the command in the console
        $output = $commandTester->getDisplay();
        $this->assertStringContainsString('Username: Wouter', $output);

        // ...
    }
}

If you are using a single-command application, call setAutoExit(false) on it to get the command result in CommandTester.

単一コマンド アプリケーションを使用している場合は、そのアプリケーションで setAutoExit(false) を呼び出して、CommandTester でコマンドの結果を取得します。

Tip

ヒント

You can also test a whole console application by using ApplicationTester.

ApplicationTester を使用して、コンソール アプリケーション全体をテストすることもできます。

Caution

注意

When testing commands using the CommandTester class, console events are not dispatched. If you need to test those events, use the ApplicationTester instead.

CommandTester クラスを使用してコマンドをテストする場合、コンソール イベントは送出されません。これらのイベントをテストする必要がある場合は、代わりに ApplicationTester を使用してください。

Caution

注意

When testing commands using the ApplicationTester class, don't forget to disable the auto exit flag:

ApplicationTesterclass を使用してコマンドをテストするときは、自動終了フラグを無効にすることを忘れないでください。
1
2
3
4
$application = new Application();
$application->setAutoExit(false);

$tester = new ApplicationTester($application);

Caution

注意

When testing InputOption::VALUE_NONE command options, you must pass an empty value to them:

InputOption::VALUE_NONE コマンド オプションをテストするときは、空の値を渡す必要があります。
1
2
$commandTester = new CommandTester($command);
$commandTester->execute(['--some-option' => '']);

Note

ノート

When using the Console component in a standalone project, use Application and extend the normal \PHPUnit\Framework\TestCase.

スタンドアロン プロジェクトで Console コンポーネントを使用する場合は、Application を使用して、通常の \PHPUnit\Framework\TestCase を拡張します。

Logging Command Errors

Whenever an exception is thrown while running commands, Symfony adds a log message for it including the entire failing command. In addition, Symfony registers an event subscriber to listen to the ConsoleEvents::TERMINATE event and adds a log message whenever a command doesn't finish with the 0 exit status.

コマンドの実行中に例外がスローされるたびに、Symfony は失敗したコマンド全体を含むログメッセージを追加します。さらに、Symfony はイベント サブスクライバーを登録して、ConsoleEvents::TERMINATE イベントをリッスンし、コマンドが終了ステータス 0 で終了しない場合は常にログ メッセージを追加します。

Learn More

The console component also contains a set of "helpers" - different small tools capable of helping you with different tasks:

コンソールコンポーネントには、一連の「ヘルパー」も含まれています。これは、さまざまなタスクを支援できるさまざまな小さなツールです。
  • Question Helper: interactively ask the user for information
    質問ヘルパー: ユーザーにインタラクティブに情報を尋ねます
  • Formatter Helper: customize the output colorization
    Formatter Helper: 出力の色付けをカスタマイズします
  • Progress Bar: shows a progress bar
    プログレス バー: プログレス バーを表示します
  • Table: displays tabular data as a table
    表: 表形式のデータを表として表示します
  • Debug Formatter Helper: provides functions to output debug information when running an external program
    Debug Formatter Helper: 外部プログラムの実行時にデバッグ情報を出力する機能を提供します
  • Cursor Helper: allows to manipulate the cursor in the terminal
    Cursor Helper: ターミナルでカーソルを操作できます