メインコンテンツまでスキップ

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 が含まれています。ただし、アプリケーションから以前に削除した場合は、Composer を使用して Tinker をインストールすることができます:

composer require laravel/tinker
注記

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

使用法

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

php artisan tinker

vendor:publish コマンドを使用して、Tinker の設定ファイルを公開できます:

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

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

コマンド許可リスト

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

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

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

通常、Tinker は 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メソッドを介して必要な依存関係をリクエストできることに注意してください。このメソッドのシグネチャで型ヒントされたすべての依存関係が自動的に注入されます。

    <?php

namespace App\Console\Commands;

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

class SendEmails extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user}';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Send a marketing email to a user';

/**
* Execute the console command.
*/
public function handle(DripEmailer $drip): void
{
$drip->send(User::find($this->argument('user')));
}
}
注記

コードの再利用性を高めるために、コンソールコマンドを軽量に保ち、アプリケーションサービスにタスクを達成させるように委任するのが良い慣行です。上記の例では、メールを送信するための "重い作業" を行うためにサービスクラスを注入していることに注意してください。

終了コード

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

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

return 1;

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

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

クロージャコマンド

クロージャベースのコマンドは、コンソールコマンドをクラスとして定義する代わりに提供されます。ルートクロージャがコントローラの代替手段であるように、コマンドクロージャはコマンドクラスの代替手段と考えてください。

routes/console.phpファイルはHTTPルートを定義していませんが、アプリケーションへのコンソールベースのエントリーポイント(ルート)を定義します。このファイル内で、Artisan::commandメソッドを使用して、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');

分離可能なコマンド

警告

この機能を利用するには、アプリケーションがデフォルトのキャッシュドライバとして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 はアプリケーションのキャッシュでアトミックロックを取得するために使用される文字列キーを生成するために、コマンドの名前を使用します。ただし、コマンドクラスで isolatableId メソッドを定義することで、キーをカスタマイズすることができます。これにより、コマンドの引数やオプションをキーに統合することができます:

/**
* Get the isolatable ID for the command.
*/
public function isolatableId(): string
{
return $this->argument('user');
}

ロックの有効期限

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

use DateTimeInterface;
use DateInterval;

/**
* Determine when an isolation lock expires for the command.
*/
public function isolationLockExpiresAt(): DateTimeInterface|DateInterval
{
return now()->addMinutes(5);
}

入力の期待値の定義

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

引数

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

    /**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user}';

引数をオプションにするか、引数のデフォルト値を定義することもできます:

    // Optional argument...
'mail:send {user?}'

// Optional argument with default value...
'mail:send {user=foo}'

オプション

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

    /**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue}';

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

php artisan mail:send 1 --queue

値を持つオプション

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

    /**
* The name and signature of the console command.
*
* @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

入力の説明

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

    /**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send
{user : The ID of the user}
{--queue : Whether the job should be queued}';

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

コマンドに必須の引数が含まれている場合、ユーザーがそれらを提供しないとエラーメッセージが表示されます。また、PromptsForMissingInput インターフェースを実装して、必要な引数が不足している場合にユーザーに自動的にプロンプトを表示するようにコマンドを構成することもできます:

    <?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;

class SendEmails extends Command implements PromptsForMissingInput
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mail:send {user}';

// ...
}

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

    /**
* Prompt for missing input arguments using the returned questions.
*
* @return array<string, string>
*/
protected function promptForMissingArgumentsUsing(): array
{
return [
'user' => 'Which user ID should receive the mail?',
];
}

プレースホルダーテキストを使用して、タプルを含めることもできます:

    return [
'user' => ['Which user ID should receive the mail?', 'E.g. 123'],
];

プロンプトをユーザーに求め、その回答を返すクロージャを提供することもできます:

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

// ...

return [
'user' => fn () => search(
label: 'Search for a user:',
placeholder: 'E.g. Taylor Otwell',
options: fn ($value) => strlen($value) > 0
? User::where('name', 'like', "%{$value}%")->pluck('name', 'id')->all()
: []
),
];
注記

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

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

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

// ...

/**
* Perform actions after the user was prompted for missing arguments.
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void
{
$input->setOption('queue', confirm(
label: 'Would you like to queue the mail?',
default: $this->option('queue')
));
}

コマンド I/O

入力の取得

コマンドが実行されている間、コマンドで受け入れられる引数やオプションの値にアクセスする必要がある場合があります。これを行うには、argumentメソッドとoptionメソッドを使用できます。引数やオプションが存在しない場合、nullが返されます:

    /**
* Execute the console command.
*/
public function handle(): void
{
$userId = $this->argument('user');
}

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

    $arguments = $this->arguments();

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

    // Retrieve a specific option...
$queueName = $this->option('queue');

// Retrieve all options as an array...
$options = $this->options();

入力のプロンプト

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

    /**
* Execute the console command.
*/
public function handle(): void
{
$name = $this->ask('What is your name?');

// ...
}

askメソッドは、オプションの第2引数を受け入れることもできます。この引数は、ユーザーが入力しない場合に返されるデフォルト値を指定します:

    $name = $this->ask('What is your name?', 'Taylor');

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

    $password = $this->secret('What is the password?');

確認を求める

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

    if ($this->confirm('Do you wish to continue?')) {
// ...
}

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

    if ($this->confirm('Do you wish to continue?', true)) {
// ...
}

オートコンプリート

anticipateメソッドを使用して、可能な選択肢のオートコンプリートを提供することができます。ユーザーはオートコンプリートのヒントに関係なく、任意の回答を提供することができます:

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

また、anticipateメソッドの第2引数にクロージャを渡すこともできます。クロージャは、ユーザーが入力文字を入力するたびに呼び出されます。クロージャは、これまでのユーザーの入力を含む文字列パラメータを受け入れ、オートコンプリートのためのオプションの配列を返す必要があります:

    $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
);

出力の書き込み

コンソールに出力するには、lineinfocommentquestionwarnerror メソッドを使用できます。これらのメソッドはそれぞれ適切な ANSI カラーを使用します。たとえば、一般的な情報をユーザーに表示するには、info メソッドを使用します。通常、info メソッドはコンソールに緑色のテキストとして表示されます:

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

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

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

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

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

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

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

    // Write a single blank line...
$this->newLine();

// Write three blank lines...
$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();
注記

より高度なオプションについては、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 メソッドは、第1引数にコマンドのシグネチャ名またはクラス名、第2引数にコマンドのパラメータの配列を受け入れます。終了コードが返されます:

    use Illuminate\Support\Facades\Artisan;

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

// ...
});

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

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

配列値の渡し方

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

    use Illuminate\Support\Facades\Artisan;

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

ブール値の渡し方

--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メソッドは、コマンド名とコマンドの引数/オプションの配列を受け入れます:

    /**
* Execute the console command.
*/
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メソッドを使用できます:

    /**
* Execute the console command.
*/
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\CommandStartingIlluminate\Console\Events\CommandFinishedArtisanStartingイベントは、Artisanが実行を開始するとすぐにディスパッチされます。次に、CommandStartingイベントは、コマンドが実行される直前にディスパッチされます。最後に、CommandFinishedイベントは、コマンドの実行が完了したときにディスパッチされます。