Artisanコンソール
はじめに
Artisanは、Laravelに含まれるコマンドラインインターフェースです。Artisanはアプリケーションのルートに`artisan`スクリプトとして存在し、アプリケーションの構築中に役立つ多くの便利なコマンドを提供します。利用可能なすべてのArtisanコマンドのリストを表示するには、`list`コマンドを使用します。
php artisan list
すべてのコマンドには「ヘルプ」画面も含まれており、コマンドで使用可能な引数とオプションが表示され、説明されます。ヘルプ画面を表示するには、コマンド名の前に`help`を付けます。
php artisan help migrate
Laravel Sail
ローカル開発環境としてLaravel Sailを使用している場合は、`sail`コマンドラインを使用してArtisanコマンドを呼び出すことを忘れないでください。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-compiled`、`down`、`env`、`inspire`、`migrate`、`migrate:install`、`up`、`optimize`コマンドを実行できます。より多くのコマンドを許可する場合は、`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`メソッドを介して必要な依存関係を要求できることに注意してください。Laravelのサービスコンテナは、このメソッドのシグネチャで型ヒントされているすべての依存関係を自動的に注入します。
<?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('Something went wrong.'); return 1;
コマンド内の任意のメソッドからコマンドを「失敗」させる場合は、`fail`メソッドを使用できます。`fail`メソッドは、コマンドの実行を直ちに終了し、`1`の終了コードを返します。
$this->fail('Something went wrong.');
クロージャコマンド
クロージャベースのコマンドは、コンソールコマンドをクラスとして定義する代替手段を提供します。ルートクロージャがコントローラーの代替手段であるのと同じように、コマンドクロージャはコマンドクラスの代替手段と考えてください。
`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');
分離可能なコマンド
この機能を利用するには、アプリケーションでmemcached
、redis
、dynamodb
、database
、file
、または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
メソッドを定義することでこのキーをカスタマイズし、コマンドの引数やオプションをキーに統合できます。
/** * 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つのハイフン(--
)を前に付けます。値を受け取るオプションと受け取らないオプションの2種類があります。値を受け取らないオプションは、ブール値の「スイッチ」として機能します。このタイプのオプションの例を見てみましょう。
/** * The name and signature of the console command. * * @var string */protected $signature = 'mail:send {user} {--queue}';
この例では、Artisanコマンドを呼び出す際に--queue
スイッチを指定できます。--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
の値を値として1
と2
を持つ配列に設定します。
php artisan mail:send 1 2
この*
文字は、オプションの引数定義と組み合わせて、0個以上の引数のインスタンスを許可することができます。
'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();
入力のプロンプト表示
Laravel Promptsは、プレースホルダーテキストやバリデーションを含むブラウザのような機能を備えた、美しくユーザーフレンドリーなフォームをコマンドラインアプリケーションに追加するためのPHPパッケージです。
出力の表示に加えて、コマンドの実行中にユーザーに入力を求めることもできます。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?')) { // ...}
必要に応じて、confirm
メソッドにtrue
を第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);
出力の記述
コンソールに出力を送信するには、line
、info
、comment
、question
、warn
、error
メソッドを使用できます。これらのメソッドはそれぞれ、目的の適切なANSIカラーを使用します。例えば、ユーザーに一般的な情報を表示してみましょう。通常、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
メソッドを使用して、Artisanコマンドを検索する他のディレクトリをLaravelに指示できます。
->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
メソッドは、コマンド名とコマンド引数/オプションの配列を受け取ります。
/** * 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\ArtisanStarting
、Illuminate\Console\Events\CommandStarting
、Illuminate\Console\Events\CommandFinished
です。ArtisanStarting
イベントは、Artisanの実行が開始されるとすぐにディスパッチされます。次に、CommandStarting
イベントは、コマンドの実行直前にディスパッチされます。最後に、CommandFinished
イベントは、コマンドの実行が完了するとディスパッチされます。