Skip to content

Artisanコンソール

はじめに

Artisanは、Laravelに含まれるコンソールインターフェースです。Artisanはアプリケーションのルートにartisanスクリプトとして存在し、アプリケーションを構築する際に役立つ多くの便利なコマンドを提供します。利用可能なすべてのArtisanコマンドのリストを表示するには、listコマンドを使用できます。

php artisan list

すべてのコマンドには、コマンドの利用可能な引数とオプションを表示および説明する「ヘルプ」画面も含まれています。ヘルプ画面を表示するには、コマンド名の前にhelpを付けます。

php artisan help migrate

Laravel Sail

ローカル開発環境としてLaravel Sailを使用している場合は、Artisanコマンドを呼び出す際にsailコンソールを使用することを忘れないでください。Sailは、アプリケーションのDockerコンテナ内でArtisanコマンドを実行します。

./vendor/bin/sail artisan list

Tinker (REPL)

Laravel Tinkerは、PsySHパッケージを利用した、Laravelフレームワーク用の強力なREPLです。

インストール

すべてのLaravelアプリケーションにはデフォルトでTinkerが含まれています。ただし、以前にアプリケーションからTinkerを削除した場合は、Composerを使用してTinkerをインストールできます。

composer require laravel/tinker

Note

Laravelアプリケーションと対話する際にホットリロード、複数行コード編集、オートコンプリートを探していますか?Tinkerwellをチェックしてください!

使用方法

Tinkerを使用すると、Eloquentモデル、ジョブ、イベントなど、Laravelアプリケーション全体をコンソールで操作できます。Tinker環境に入るには、tinker Artisanコマンドを実行します。

php artisan tinker

Tinkerの設定ファイルを公開するには、vendor:publishコマンドを使用します。

php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"

Warning

dispatchヘルパ関数とDispatchableクラスのdispatchメソッドは、ジョブをキューに配置するためにガベージコレクションに依存しています。したがって、tinkerを使用する場合は、ジョブをディスパッチするためにBus::dispatchまたはQueue::pushを使用する必要があります。

コマンド許可リスト

Tinkerは、どのArtisanコマンドがそのシェル内で実行できるかを決定するために「許可」リストを使用します。デフォルトでは、clear-compileddownenvinspiremigratemigrate:installupoptimizeコマンドを実行できます。さらに多くのコマンドを許可したい場合は、tinker.php設定ファイルのcommands配列に追加できます。

'commands' => [
    // App\Console\Commands\ExampleCommand::class,
],

エイリアス化すべきでないクラス

通常、Tinker はクラスと対話する際に自動的にクラスにエイリアスを付けます。しかし、一部のクラスにはエイリアスを付けたくない場合があります。これは、tinker.php 設定ファイルの dont_alias 配列にクラスをリストすることで実現できます:

'dont_alias' => [
    App\Models\User::class,
],

コマンドの作成

Artisan に付属するコマンドに加えて、独自のカスタムコマンドを作成することもできます。コマンドは通常 app/Console/Commands ディレクトリに保存されますが、Composer でコマンドをロードできる限り、保存場所は自由に選択できます。

コマンドの生成

新しいコマンドを作成するには、make:command Artisan コマンドを使用できます。このコマンドは、app/Console/Commands ディレクトリに新しいコマンドクラスを作成します。このディレクトリがアプリケーションに存在しない場合でも心配はいりません - make:command Artisan コマンドを初めて実行したときに作成されます:

php artisan make:command SendEmails

コマンドの構造

コマンドを生成した後、クラスの signature および description プロパティに適切な値を定義する必要があります。これらのプロパティは、コマンドを list 画面に表示する際に使用されます。signature プロパティでは、コマンドの入力期待値を定義することもできます。コマンドが実行されると、handle メソッドが呼び出されます。コマンドのロジックはこのメソッドに配置できます。

例として、コマンドを見てみましょう。コマンドの handle メソッドを介して必要な依存関係を要求できることに注意してください。Laravel の サービスコンテナ は、このメソッドのシグネチャで型ヒントされたすべての依存関係を自動的に注入します:

<?php

namespace App\Console\Commands;

use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command { /* * コンソールコマンドの名前とシグネチャ。 * * @var string / protected $signature = 'mail:send {user}';

/**
 * コンソールコマンドの説明。
 *
 * @var string
 */
protected $description = 'ユーザーにマーケティングメールを送信する';

/**
 * コンソールコマンドを実行する。
 */
public function handle(DripEmailer $drip): void
{
    $drip->send(User::find($this->argument('user')));
}

}

Note

コードの再利用性を高めるために、コンソールコマンドを軽量に保ち、タスクを実行するためにアプリケーションサービスに処理を委譲することが良いプラクティスです。上記の例では、メール送信という「重い処理」を行うためにサービスクラスを注入していることに注意してください。

終了コード

handle メソッドから何も返されず、コマンドが正常に実行された場合、コマンドは成功を示す 0 の終了コードで終了します。ただし、handle メソッドはオプションで整数を返すことで、コマンドの終了コードを手動で指定することができます。

$this->error('何かがうまくいかなかった。');

return 1;

コマンド内の任意のメソッドからコマンドを「失敗」させたい場合は、fail メソッドを利用できます。fail メソッドはコマンドの実行を即座に終了させ、終了コード 1 を返します。

$this->fail('何かがうまくいかなかった。');

クロージャコマンド

クロージャベースのコマンドは、コンソールコマンドをクラスとして定義する代わりの方法を提供します。ルートクロージャがコントローラの代わりになるのと同様に、コマンドクロージャはコマンドクラスの代替として考えることができます。

routes/console.phpファイルはHTTPルートを定義しませんが、コンソールベースのエントリポイント(ルート)をアプリケーションに定義します。このファイル内で、Artisan::commandメソッドを使用して、すべてのクロージャベースのコンソールコマンドを定義できます。commandメソッドは2つの引数を受け取ります:コマンドシグネチャと、コマンドの引数とオプションを処理するクロージャです:

Artisan::command('mail:send {user}', function (string $user) {
    $this->info("Sending email to: {$user}!");
});

クロージャは基礎となるコマンドインスタンスにバインドされているため、通常は完全なコマンドクラスでアクセスできるすべてのヘルパーメソッドに完全にアクセスできます。

依存関係のタイプヒント

コマンドの引数とオプションを受け取るだけでなく、コマンドクロージャは、サービスコンテナから解決したい追加の依存関係をタイプヒントすることもできます:

use App\Models\User;
use App\Support\DripEmailer;

Artisan::command('mail:send {user}', function (DripEmailer $drip, string $user) {
    $drip->send(User::find($user));
});

クロージャコマンドの説明

クロージャベースのコマンドを定義する際に、purposeメソッドを使用してコマンドに説明を追加できます。この説明は、php artisan listまたはphp artisan helpコマンドを実行したときに表示されます:

Artisan::command('mail:send {user}', function (string $user) {
    // ...
})->purpose('Send a marketing email to a user');

分離可能なコマンド

Warning

この機能を利用するには、アプリケーションがmemcachedredisdynamodbdatabasefile、またはarrayキャッシュドライバをアプリケーションのデフォルトキャッシュドライバとして使用している必要があります。さらに、すべてのサーバーが同じ中央キャッシュサーバーと通信している必要があります。

場合によっては、一度に1つのコマンドインスタンスのみが実行されるようにしたいことがあります。これを実現するために、コマンドクラスに Illuminate\Contracts\Console\Isolatable インターフェースを実装することができます。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Isolatable;

class SendEmails extends Command implements Isolatable
{
    // ...
}

コマンドが Isolatable としてマークされると、Laravelは自動的にコマンドに --isolated オプションを追加します。そのオプションを指定してコマンドが呼び出されると、Laravelはそのコマンドの他のインスタンスが既に実行されていないことを確認します。Laravelは、アプリケーションのデフォルトのキャッシュドライバを使用してアトミックロックを取得することでこれを実現します。もし他のインスタンスが実行中であれば、コマンドは実行されませんが、コマンドは成功の終了ステータスコードで終了します。

php artisan mail:send 1 --isolated

コマンドが実行できなかった場合に返す終了ステータスコードを指定したい場合は、isolated オプションを介して希望のステータスコードを指定できます。

php artisan mail:send 1 --isolated=12

ロックID

デフォルトでは、Laravelはコマンドの名前を使用して、アプリケーションのキャッシュでアトミックロックを取得するために使用される文字列キーを生成します。ただし、Artisanコマンドクラスに isolatableId メソッドを定義することでこのキーをカスタマイズできます。これにより、コマンドの引数やオプションをキーに組み込むことができます。

/**
 * コマンドの分離可能なIDを取得します。
 */
public function isolatableId(): string
{
    return $this->argument('user');
}

ロックの有効期限

ロックの有効期限については、デフォルトではLaravelが自動的に管理しますが、必要に応じてカスタマイズすることも可能です。

デフォルトでは、隔離ロックはコマンドが終了した後に期限切れになります。または、コマンドが中断されて終了できない場合、ロックは1時間後に期限切れになります。ただし、コマンドに isolationLockExpiresAt メソッドを定義することで、ロックの有効期限を調整できます。

use DateTimeInterface;
use DateInterval;

/**
 * コマンドの隔離ロックがいつ期限切れになるかを決定します。
 */
public function isolationLockExpiresAt(): DateTimeInterface|DateInterval
{
    return now()->addMinutes(5);
}

入力の期待値の定義

コンソールコマンドを書く際、引数やオプションを通じてユーザーからの入力を収集することが一般的です。Laravelでは、コマンドの signature プロパティを使用して、ユーザーから期待する入力を定義することが非常に便利です。signature プロパティを使用すると、コマンドの名前、引数、オプションを1つの表現力豊かなルートのような構文で定義できます。

引数

ユーザーが提供するすべての引数とオプションは、中括弧で囲まれます。以下の例では、コマンドは1つの必須引数 user を定義しています。

/**
 * コンソールコマンドの名前とシグネチャ。
 *
 * @var string
 */
protected $signature = 'mail:send {user}';

引数をオプションにしたり、引数にデフォルト値を定義することもできます。

// オプションの引数...
'mail:send {user?}'

// デフォルト値を持つオプションの引数...
'mail:send {user=foo}'

オプション

オプションは、引数と同様に、ユーザー入力の別の形式です。オプションは、コンソールから提供されるときに2つのハイフン (--) が前に付きます。オプションには、値を受け取るものと受け取らないものの2種類があります。値を受け取らないオプションは、ブール値の "スイッチ" として機能します。このタイプのオプションの例を見てみましょう。

/**
 * コンソールコマンドの名前とシグネチャ。
 *
 * @var string
 */
protected $signature = 'mail:send {user} {--queue}';

この例では、Artisanコマンドを呼び出す際に--queueスイッチを指定することができます。--queueスイッチが渡された場合、オプションの値はtrueになります。それ以外の場合、値はfalseになります:

php artisan mail:send 1 --queue

値を持つオプション

次に、値を期待するオプションを見てみましょう。ユーザーがオプションに値を指定する必要がある場合、オプション名の後に=記号を付ける必要があります:

/**
 * コンソールコマンドの名前とシグネチャ。
 *
 * @var string
 */
protected $signature = 'mail:send {user} {--queue=}';

この例では、ユーザーは次のようにオプションに値を渡すことができます。オプションがコマンドの呼び出し時に指定されない場合、その値はnullになります:

php artisan mail:send 1 --queue=default

オプション名の後にデフォルト値を指定することで、オプションにデフォルト値を割り当てることができます。ユーザーがオプションの値を渡さない場合、デフォルト値が使用されます:

'mail:send {user} {--queue=default}'

オプションのショートカット

オプションを定義する際にショートカットを割り当てるには、オプション名の前に指定し、|文字を使用してショートカットと完全なオプション名を区切ることができます:

'mail:send {user} {--Q|queue}'

ターミナルでコマンドを呼び出す際、オプションのショートカットには単一のハイフンを付け、オプションの値を指定する際に=記号を含めるべきではありません:

php artisan mail:send 1 -Qdefault

入力配列

複数の入力値を期待する引数やオプションを定義したい場合、*文字を使用することができます。まず、そのような引数を指定する例を見てみましょう:

'mail:send {user*}'

このメソッドを呼び出す際、user引数はコンソールに順番に渡すことができます。例えば、以下のコマンドはuserの値を12を値とする配列に設定します。

php artisan mail:send 1 2

この*文字は、オプションの引数定義と組み合わせて、引数のゼロ以上のインスタンスを許可するために使用できます。

'mail:send {user?*}'

オプション配列

複数の入力値を期待するオプションを定義する場合、コマンドに渡される各オプション値にはオプション名をプレフィックスとして付ける必要があります。

'mail:send {--id=*}'

このようなコマンドは、複数の--id引数を渡すことで呼び出すことができます。

php artisan mail:send --id=1 --id=2

入力の説明

引数名と説明をコロンで区切ることで、入力引数とオプションに説明を割り当てることができます。コマンドの定義に少し余裕が必要な場合は、定義を複数行に広げても構いません。

/**
 * コンソールコマンドの名前とシグネチャ。
 *
 * @var string
 */
protected $signature = 'mail:send
                        {user : ユーザーのID}
                        {--queue : ジョブをキューに入れるかどうか}';

不足している入力のプロンプト

コマンドに必須の引数が含まれている場合、ユーザーはそれらが提供されないとエラーメッセージを受け取ります。代わりに、PromptsForMissingInputインターフェースを実装することで、必須の引数が欠落している場合に自動的にユーザーにプロンプトを表示するようにコマンドを設定できます。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;
class SendEmails extends Command implements PromptsForMissingInput
{
    /**
     * コンソールコマンドの名前とシグネチャ。
     *
     * @var string
     */
    protected $signature = 'mail:send {user}';

    // ...
}

Laravelがユーザーから必須の引数を収集する必要がある場合、引数名または説明を使用して賢く質問を組み立て、ユーザーに自動的に質問します。必須の引数を収集するために使用される質問をカスタマイズしたい場合は、promptForMissingArgumentsUsingメソッドを実装し、引数名をキーとする質問の配列を返すことができます。

/**
 * 不足している入力引数に対して返される質問を使用してプロンプトを表示します。
 *
 * @return array<string, string>
 */
protected function promptForMissingArgumentsUsing(): array
{
    return [
        'user' => 'どのユーザーIDにメールを送信すべきですか?',
    ];
}

プレースホルダーテキストを提供するには、質問とプレースホルダーを含むタプルを使用します。

return [
    'user' => ['どのユーザーIDにメールを送信すべきですか?', '例: 123'],
];

プロンプトを完全に制御したい場合は、ユーザーにプロンプトを表示し、その回答を返すクロージャを提供することができます。

use App\Models\User;
use function Laravel\Prompts\search;

// ...

return [
    'user' => fn () => search(
        label: 'ユーザーを検索:',
        placeholder: '例: Taylor Otwell',
        options: fn ($value) => strlen($value) > 0
            ? User::where('name', 'like', "%{$value}%")->pluck('name', 'id')->all()
            : []
    ),
];

Note

利用可能なプロンプトとその使用方法に関する詳細情報は、Laravel Promptsの包括的なドキュメントに記載されています。

ユーザーにオプションを選択または入力するよう促したい場合、コマンドのhandleメソッドにプロンプトを含めることができます。ただし、ユーザーが不足している引数について自動的にプロンプトされた場合にのみユーザーにプロンプトを表示したい場合は、afterPromptingForMissingArgumentsメソッドを実装することができます。

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use function Laravel\Prompts\confirm;

// ...

/**
 * ユーザーが不足している引数についてプロンプトされた後にアクションを実行する。
 */
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void
{
    $input->setOption('queue', confirm(
        label: 'Would you like to queue the mail?',
        default: $this->option('queue')
    ));
}

コマンドの入出力

入力の取得

コマンドの実行中に、コマンドの引数とオプションの値にアクセスする必要がある場合があります。そのためには、argumentメソッドとoptionメソッドを使用できます。引数またはオプションが存在しない場合、nullが返されます。

/**
 * コンソールコマンドを実行する。
 */
public function handle(): void
{
    $userId = $this->argument('user');
}

すべての引数をarrayとして取得する場合は、argumentsメソッドを呼び出します。

$arguments = $this->arguments();

オプションは引数と同様にoptionメソッドを使用して取得できます。すべてのオプションを配列として取得するには、optionsメソッドを呼び出します。

// 特定のオプションを取得...
$queueName = $this->option('queue');

// すべてのオプションを配列として取得...
$options = $this->options();

入力のプロンプト

ユーザーに入力を求めるプロンプトを表示する方法については、以下のセクションで詳しく説明します。

Note

Laravel Prompts は、コンソールアプリケーションに美しくユーザーフレンドリーなフォームを追加するためのPHPパッケージです。プレースホルダーテキストやバリデーションを含むブラウザのような機能を備えています。

出力を表示するだけでなく、コマンドの実行中にユーザーに入力を求めることもできます。askメソッドは、指定された質問をユーザーに提示し、その入力を受け取り、その後ユーザーの入力をコマンドに返します。

/**
 * コンソールコマンドを実行する。
 */
public function handle(): void
{
    $name = $this->ask('あなたの名前は何ですか?');

    // ...
}

askメソッドは、ユーザーが入力を提供しなかった場合に返されるデフォルト値を指定するためのオプションの第二引数も受け入れます。

$name = $this->ask('あなたの名前は何ですか?', 'Taylor');

secretメソッドはaskに似ていますが、ユーザーがコンソールに入力する際にその入力が表示されません。このメソッドは、パスワードなどの機密情報を尋ねる際に便利です。

$password = $this->secret('パスワードは何ですか?');

確認を求める

ユーザーに簡単な「はいかいいえ」の確認を求める必要がある場合、confirmメソッドを使用できます。デフォルトでは、このメソッドはfalseを返します。ただし、ユーザーがプロンプトに対してyまたはyesと入力した場合、メソッドはtrueを返します。

if ($this->confirm('続行しますか?')) {
    // ...
}

必要に応じて、確認プロンプトがデフォルトでtrueを返すように指定するには、confirmメソッドの第二引数にtrueを渡します。

if ($this->confirm('続行しますか?', true)) {
    // ...
}

自動補完

anticipateメソッドは、可能な選択肢の自動補完を提供するために使用できます。ユーザーは自動補完のヒントに関係なく、任意の回答を提供できます。

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

Alternatively, you may pass a closure as the second argument to the anticipate method. The closure will be called each time the user types an input character. The closure should accept a string parameter containing the user's input so far, and return an array of options for auto-completion:

$name = $this->anticipate('What is your address?', function (string $input) {
    // Return auto-completion options...
});

複数選択の質問

質問をする際に、ユーザーに事前に定義された選択肢を提示する必要がある場合、choiceメソッドを使用できます。オプションが選択されなかった場合に返されるデフォルト値の配列インデックスを、メソッドの第3引数として渡すことができます:

$name = $this->choice( 'What is your name?', ['Taylor', 'Dayle'], $defaultIndex );

さらに、choiceメソッドは、有効な応答を選択するための最大試行回数と、複数の選択が許可されるかどうかを決定するためのオプションの第4引数と第5引数を受け入れます:

$name = $this->choice( 'What is your name?', ['Taylor', 'Dayle'], $defaultIndex, $maxAttempts = null, $allowMultipleSelections = false );

出力の書き込み

コンソールに出力を送信するには、lineinfocommentquestionwarn、およびerrorメソッドを使用できます。これらの各メソッドは、その目的に適したANSIカラーを使用します。例えば、ユーザーに一般的な情報を表示する場合、通常、infoメソッドはコンソールに緑色のテキストとして表示されます:

/* * Execute the console command. / public function handle(): void { // ...

$this->info('The command was successful!');

}

エラーメッセージを表示するには、errorメソッドを使用します。エラーメッセージのテキストは通常、赤色で表示されます:

```php
$this->error('Something went wrong!');

プレーンで色の付いていないテキストを表示するには、lineメソッドを使用できます:

$this->line('Display this on the screen');

空白行を表示するには、newLineメソッドを使用できます:

// 1行の空白行を表示...
$this->newLine();

// 3行の空白行を表示...
$this->newLine(3);

テーブル

tableメソッドを使用すると、複数の行/列のデータを簡単に正しくフォーマットできます。必要なのは、テーブルの列名とデータを提供することだけで、Laravelが自動的にテーブルの適切な幅と高さを計算します:

use App\Models\User;

$this->table(
    ['Name', 'Email'],
    User::all(['name', 'email'])->toArray()
);

プログレスバー

長時間かかるタスクの場合、タスクがどの程度完了しているかをユーザーに知らせるプログレスバーを表示すると便利です。withProgressBarメソッドを使用すると、Laravelはプログレスバーを表示し、指定された反復可能な値を反復するたびにその進行状況を進めます:

use App\Models\User;

$users = $this->withProgressBar(User::all(), function (User $user) {
    $this->performTask($user);
});

場合によっては、プログレスバーの進行をより細かく制御する必要がある場合があります。まず、プロセスが反復するステップの総数を定義します。次に、各アイテムを処理した後にプログレスバーを進めます:

$users = App\Models\User::all();

$bar = $this->output->createProgressBar(count($users));

$bar->start();

foreach ($users as $user) {
    $this->performTask($user);

    $bar->advance();
}

$bar->finish();

Note

より高度なオプションについては、Symfony Progress Barコンポーネントのドキュメントを確認してください。

コマンドの登録

デフォルトでは、Laravelはapp/Console/Commandsディレクトリ内のすべてのコマンドを自動的に登録します。ただし、アプリケーションのbootstrap/app.phpファイル内でwithCommandsメソッドを使用して、LaravelにArtisanコマンドを他のディレクトリからスキャンするよう指示することもできます。

->withCommands([
    __DIR__.'/../app/Domain/Orders/Commands',
])

必要に応じて、コマンドのクラス名をwithCommandsメソッドに渡すことで、手動でコマンドを登録することもできます。

use App\Domain\Orders\Commands\SendEmails;

->withCommands([
    SendEmails::class,
])

Artisanが起動すると、アプリケーション内のすべてのコマンドがサービスコンテナによって解決され、Artisanに登録されます。

プログラムによるコマンドの実行

CLI以外でArtisanコマンドを実行したい場合があります。例えば、ルートやコントローラからArtisanコマンドを実行したい場合です。Artisanファサードのcallメソッドを使用してこれを実現できます。callメソッドは、コマンドのシグネチャ名またはクラス名を最初の引数として受け取り、コマンドパラメータの配列を2番目の引数として受け取ります。終了コードが返されます。

use Illuminate\Support\Facades\Artisan;

Route::post('/user/{user}/mail', function (string $user) {
    $exitCode = Artisan::call('mail:send', [
        'user' => $user, '--queue' => 'default'
    ]);

    // ...
});

または、Artisanコマンド全体を文字列としてcallメソッドに渡すこともできます。

Artisan::call('mail:send 1 --queue=default');

配列値の渡し方

コマンドが配列を受け入れるオプションを定義している場合、そのオプションに値の配列を渡すことができます。

use Illuminate\Support\Facades\Artisan;

Route::post('/mail', function () {
    $exitCode = Artisan::call('mail:send', [
        '--id' => [5, 13]
    ]);
});

ブール値の引き渡し

文字列値を受け入れないオプション(migrate:refreshコマンドの--forceフラグなど)の値を指定する必要がある場合は、オプションの値としてtrueまたはfalseを渡すべきです:

$exitCode = Artisan::call('migrate:refresh', [
    '--force' => true,
]);

Artisanコマンドのキューイング

Artisanファサードのqueueメソッドを使用すると、Artisanコマンドをキューに入れて、キューワーカーによってバックグラウンドで処理されるようにすることもできます。このメソッドを使用する前に、キューの設定とキューリスナーの実行が完了していることを確認してください:

use Illuminate\Support\Facades\Artisan;

Route::post('/user/{user}/mail', function (string $user) {
    Artisan::queue('mail:send', [
        'user' => $user, '--queue' => 'default'
    ]);

    // ...
});

onConnectionメソッドとonQueueメソッドを使用して、Artisanコマンドをディスパッチする接続やキューを指定できます:

Artisan::queue('mail:send', [
    'user' => 1, '--queue' => 'default'
])->onConnection('redis')->onQueue('commands');

他のコマンドからのコマンド呼び出し

既存のArtisanコマンドから他のコマンドを呼び出したい場合があります。callメソッドを使用してこれを行うことができます。このcallメソッドは、コマンド名とコマンドの引数/オプションの配列を受け取ります:

/**
 * コンソールコマンドの実行
 */
public function handle(): void
{
    $this->call('mail:send', [
        'user' => 1, '--queue' => 'default'
    ]);

    // ...
}

別のコンソールコマンドを呼び出し、そのすべての出力を抑制したい場合は、callSilentlyメソッドを使用できます。callSilentlyメソッドは、callメソッドと同じシグネチャを持っています:

$this->callSilently('mail:send', [
    'user' => 1, '--queue' => 'default'
]);

シグナルハンドリング

ご存知のように、オペレーティングシステムは実行中のプロセスにシグナルを送信することができます。例えば、SIGTERMシグナルは、オペレーティングシステムがプログラムに終了を要求する方法です。Artisanコンソールコマンドでシグナルをリッスンし、発生したときにコードを実行したい場合は、trapメソッドを使用できます。

/**
 * コンソールコマンドの実行
 */
public function handle(): void
{
    $this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false);

    while ($this->shouldKeepRunning) {
        // ...
    }
}

一度に複数のシグナルをリッスンするには、trapメソッドにシグナルの配列を渡すことができます。

$this->trap([SIGTERM, SIGQUIT], function (int $signal) {
    $this->shouldKeepRunning = false;

    dump($signal); // SIGTERM / SIGQUIT
});

スタブのカスタマイズ

Artisanコンソールのmakeコマンドは、コントローラ、ジョブ、マイグレーション、テストなど、さまざまなクラスを作成するために使用されます。これらのクラスは、"スタブ"ファイルを使用して生成され、入力に基づいて値が設定されます。しかし、Artisanによって生成されるファイルに小さな変更を加えたい場合があります。これを実現するには、stub:publishコマンドを使用して、最も一般的なスタブをアプリケーションに公開し、カスタマイズできるようにします。

php artisan stub:publish

公開されたスタブは、アプリケーションのルートにあるstubsディレクトリ内に配置されます。これらのスタブに加えた変更は、Artisanのmakeコマンドを使用して対応するクラスを生成する際に反映されます。

イベント

Artisanは、コマンド実行時に3つのイベントを発行します: Illuminate\Console\Events\ArtisanStartingIlluminate\Console\Events\CommandStarting、そして Illuminate\Console\Events\CommandFinishedです。ArtisanStartingイベントは、Artisanが実行を開始した直後に発行されます。次に、CommandStartingイベントは、コマンドが実行される直前に発行されます。最後に、CommandFinishedイベントは、コマンドの実行が完了した後に発行されます。

ユーザーノート