How to Make Commands Lazily Loaded

Note

ノート

If you are using the Symfony full-stack framework, you are probably looking for details about creating lazy commands

Symfony フルスタック フレームワークを使用している場合は、遅延コマンドの作成に関する詳細を探している可能性があります。

The traditional way of adding commands to your application is to use add(), which expects a Command instance as an argument.

アプリケーションにコマンドを追加する従来の方法は、add() を使用することです。これは、aCommand インスタンスを引数として想定します。

In order to lazy-load commands, you need to register an intermediate loader which will be responsible for returning Command instances:

コマンドを遅延ロードするには、 Command インスタンスを返す役割を持つ中間ローダーを登録する必要があります。
1
2
3
4
5
6
7
8
9
10
11
use App\Command\HeavyCommand;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\CommandLoader\FactoryCommandLoader;

$commandLoader = new FactoryCommandLoader([
    'app:heavy' => function () { return new HeavyCommand(); },
]);

$application = new Application();
$application->setCommandLoader($commandLoader);
$application->run();

This way, the HeavyCommand instance will be created only when the app:heavy command is actually called.

このように、HeavyCommand インスタンスは app:heavycommand が実際に呼び出されたときにのみ作成されます。

This example makes use of the built-in FactoryCommandLoader class, but the setCommandLoader() method accepts any CommandLoaderInterface instance so you can use your own implementation.

この例では組み込みの FactoryCommandLoader クラスを使用していますが、setCommandLoader() メソッドは任意の CommandLoaderInterface インスタンスを受け入れるため、独自の実装を使用できます。

Built-in Command Loaders

FactoryCommandLoader

The FactoryCommandLoader class provides a way of getting commands lazily loaded as it takes an array of Command factories as its only constructor argument:

FactoryCommandLoader クラスは、コマンド ファクトリの配列を唯一のコンストラクタ引数として受け取るため、コマンドを遅延ロードする方法を提供します。
1
2
3
4
5
6
use Symfony\Component\Console\CommandLoader\FactoryCommandLoader;

$commandLoader = new FactoryCommandLoader([
    'app:foo' => function () { return new FooCommand(); },
    'app:bar' => [BarCommand::class, 'create'],
]);

Factories can be any PHP callable and will be executed each time get() is called.

ファクトリは任意の PHP 呼び出し可能であり、get() が呼び出されるたびに実行されます。

ContainerCommandLoader

The ContainerCommandLoader class can be used to load commands from a PSR-11 container. As such, its constructor takes a PSR-11 ContainerInterface implementation as its first argument and a command map as its last argument. The command map must be an array with command names as keys and service identifiers as values:

ContainerCommandLoader クラスを使用して、PSR-11 コンテナーからコマンドをロードできます。そのため、そのコンストラクターは、最初の引数として PSR-11 ContainerInterface 実装を受け取り、最後の引数としてコマンド マップを受け取ります。コマンド マップは、コマンド名をキーとし、サービス識別子を値とする配列である必要があります。
1
2
3
4
5
6
7
8
9
10
use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
use Symfony\Component\DependencyInjection\ContainerBuilder;

$containerBuilder = new ContainerBuilder();
$containerBuilder->register(FooCommand::class, FooCommand::class);
$containerBuilder->compile();

$commandLoader = new ContainerCommandLoader($containerBuilder, [
    'app:foo' => FooCommand::class,
]);

Like this, executing the app:foo command will load the FooCommand service by calling $containerBuilder->get(FooCommand::class).

このように、app:foo コマンドを実行すると、$containerBuilder->get(FooCommand::class) を呼び出して FooCommand サービスが読み込まれます。