Artisanコンソール
イントロダクション
ArtisanはLaravelに含まれるコマンドラインインターフェイスです。Artisanはアプリケーションのルートにartisanスクリプトとして存在し、アプリケーションの構築中に役立つ多くの便利なコマンドを提供します。利用可能なすべてのArtisanコマンドの一覧を表示するには、listコマンドを使用します。
1php artisan list
各コマンドには、コマンドで利用可能な引数とオプションを表示・説明する「ヘルプ」画面も含まれています。ヘルプ画面を表示するには、コマンド名の前にhelpを付けます。
1php artisan help migrate
Laravel Sail
ローカル開発環境としてLaravel Sailを使用している場合は、sailコマンドラインを使用してArtisanコマンドを呼び出すことを忘れないでください。Sailは、アプリケーションのDockerコンテナ内でArtisanコマンドを実行します。
1./vendor/bin/sail artisan list
Tinker (REPL)
Laravel Tinkerは、PsySHパッケージを搭載した、Laravelフレームワーク用の強力なREPLです。
インストール
すべてのLaravelアプリケーションには、デフォルトでTinkerが含まれています。ただし、以前にアプリケーションから削除した場合は、Composerを使用してTinkerをインストールできます。
1composer require laravel/tinker
Laravelアプリケーションを操作する際のホットリロード、複数行のコード編集、オートコンプリートをお探しですか?Tinkerwellをチェックしてください!
使用法
Tinkerを使用すると、Eloquentモデル、ジョブ、イベントなど、Laravelアプリケーション全体とコマンドラインで対話できます。Tinker環境に入るには、tinker Artisanコマンドを実行します。
1php artisan tinker
vendor:publishコマンドを使用してTinkerの設定ファイルをリソース公開できます。
1php 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配列に追加します。
1'commands' => [2 // App\Console\Commands\ExampleCommand::class,3],
エイリアスすべきでないクラス
通常、TinkerはTinkerでクラスを操作すると、自動的にエイリアスを作成します。しかし、一部のクラスはエイリアスしたくない場合があります。これを実現するには、tinker.php設定ファイルのdont_alias配列にクラスをリストします。
1'dont_alias' => [2 App\Models\User::class,3],
コマンドの作成
Artisanで提供されるコマンドに加えて、独自のカスタムコマンドを構築できます。コマンドは通常app/Console/Commandsディレクトリに保存されますが、コマンドがComposerによってロードできる限り、独自の保存場所を自由に選択できます。
コマンドの生成
新しいコマンドを作成するには、make:command Artisanコマンドを使用できます。このコマンドは、app/Console/Commandsディレクトリに新しいコマンドクラスを作成します。アプリケーションにこのディレクトリが存在しなくても心配ありません。最初にmake:command Artisanコマンドを実行したときに作成されます。
1php artisan make:command SendEmails
コマンドの構造
コマンドを生成した後、クラスのsignatureプロパティとdescriptionプロパティに適切な値を定義する必要があります。これらのプロパティは、コマンドをlist画面に表示するときに使用されます。signatureプロパティでは、コマンドの入力期待値も定義できます。handleメソッドは、コマンドが実行されるときに呼び出されます。このメソッドにコマンドロジックを配置できます。
コマンドの例を見てみましょう。コマンドのhandleメソッドを介して、必要な依存関係をリクエストできることに注意してください。Laravelのサービスコンテナは、このメソッドのシグネチャでタイプヒントされているすべての依存関係を自動的に注入します。
1<?php 2 3namespace App\Console\Commands; 4 5use App\Models\User; 6use App\Support\DripEmailer; 7use Illuminate\Console\Command; 8 9class SendEmails extends Command10{11 /**12 * The name and signature of the console command.13 *14 * @var string15 */16 protected $signature = 'mail:send {user}';17 18 /**19 * The console command description.20 *21 * @var string22 */23 protected $description = 'Send a marketing email to a user';24 25 /**26 * Execute the console command.27 */28 public function handle(DripEmailer $drip): void29 {30 $drip->send(User::find($this->argument('user')));31 }32}
コードの再利用性を高めるために、コンソールコマンドを軽量に保ち、アプリケーションサービスにタスクを委ねるのが良い方法です。上記の例では、電子メールを送信するという「面倒な作業」を行うためにサービスクラスを注入していることに注意してください。
終了コード
handleメソッドから何も返されず、コマンドが正常に実行された場合、コマンドは成功を示す0の終了コードで終了します。ただし、handleメソッドは、コマンドの終了コードを手動で指定するために整数を返すこともできます。
1$this->error('Something went wrong.');2 3return 1;
コマンド内の任意のメソッドからコマンドを「失敗」させたい場合は、failメソッドを利用できます。failメソッドは、コマンドの実行を直ちに終了し、1の終了コードを返します。
1$this->fail('Something went wrong.');
クロージャコマンド
クロージャベースのコマンドは、コンソールコマンドをクラスとして定義する代わりになるものです。ルートクロージャがコントローラの代わりになるのと同じように、コマンドクロージャはコマンドクラスの代わりと考えてください。
routes/console.phpファイルはHTTPルートを定義しませんが、アプリケーションへのコンソールベースのエントリポイント(ルート)を定義します。このファイル内で、Artisan::commandメソッドを使用して、すべてのクロージャベースのコンソールコマンドを定義できます。commandメソッドは、コマンドのシグネチャと、コマンドの引数とオプションを受け取るクロージャの2つの引数を取ります。
1Artisan::command('mail:send {user}', function (string $user) {2 $this->info("Sending email to: {$user}!");3});
クロージャは基になるコマンドインスタンスに束縛されているため、完全なコマンドクラスで通常アクセスできるすべてのヘルパメソッドに完全にアクセスできます。
依存関係のタイプヒント
コマンドの引数とオプションを受け取るだけでなく、コマンドクロージャは、サービスコンテナから解決したい追加の依存関係をタイプヒントすることもできます。
1use App\Models\User;2use App\Support\DripEmailer;3 4Artisan::command('mail:send {user}', function (DripEmailer $drip, string $user) {5 $drip->send(User::find($user));6});
クロージャコマンドの説明
クロージャベースのコマンドを定義するとき、purposeメソッドを使用してコマンドに説明を追加できます。この説明は、php artisan listまたはphp artisan helpコマンドを実行したときに表示されます。
1Artisan::command('mail:send {user}', function (string $user) {2 // ...3})->purpose('Send a marketing email to a user');
分離可能コマンド
この機能を利用するには、アプリケーションのデフォルトキャッシュドライバとしてmemcached、redis、dynamodb、database、file、またはarrayキャッシュドライバを使用している必要があります。さらに、すべてのサーバが同じ中央キャッシュサーバと通信している必要があります。
コマンドのインスタンスが一度に1つしか実行されないようにしたい場合があります。これを実現するには、コマンドクラスにIlluminate\Contracts\Console\Isolatableインターフェイスを実装します。
1<?php 2 3namespace App\Console\Commands; 4 5use Illuminate\Console\Command; 6use Illuminate\Contracts\Console\Isolatable; 7 8class SendEmails extends Command implements Isolatable 9{10 // ...11}
コマンドがIsolatableとしてマークされると、Laravelは自動的に--isolatedオプションをコマンドに追加します。そのオプションを付けてコマンドが呼び出されると、Laravelは他のコマンドインスタンスが既に実行されていないことを確認します。Laravelは、アプリケーションのデフォルトのキャッシュドライバを使用してアトミックロックを取得しようとすることでこれを実現します。コマンドの他のインスタンスが実行されている場合、コマンドは実行されませんが、コマンドは成功の終了ステータスコードで終了します。
1php artisan mail:send 1 --isolated
実行できない場合にコマンドが返す終了ステータスコードを指定したい場合は、isolatedオプションを介して目的のステータスコードを指定できます。
1php artisan mail:send 1 --isolated=12
ロックID
デフォルトで、Laravelはコマンド名を使用して、アプリケーションのキャッシュでアトミックロックを取得するために使用される文字列キーを生成します。ただし、ArtisanコマンドクラスにisolatableIdメソッドを定義することで、このキーをカスタマイズでき、コマンドの引数またはオプションをキーに統合できます。
1/**2 * Get the isolatable ID for the command.3 */4public function isolatableId(): string5{6 return $this->argument('user');7}
ロックの有効期限
デフォルトでは、分離ロックはコマンドが終了した後に期限切れになります。または、コマンドが中断されて終了できない場合、ロックは1時間後に期限切れになります。ただし、コマンドでisolationLockExpiresAtメソッドを定義することで、ロックの有効期限を調整できます。
1use DateTimeInterface; 2use DateInterval; 3 4/** 5 * Determine when an isolation lock expires for the command. 6 */ 7public function isolationLockExpiresAt(): DateTimeInterface|DateInterval 8{ 9 return now()->addMinutes(5);10}
入力定義
コンソールコマンドを作成する場合、引数やオプションを通じてユーザーから入力を収集するのが一般的です。Laravelでは、コマンドのsignatureプロパティを使用して、ユーザーに期待する入力を非常に便利に定義できます。signatureプロパティを使用すると、コマンドの名前、引数、オプションを、単一の表現力豊かなルートのような構文で定義できます。
引数
ユーザーが指定したすべての引数とオプションは、波括弧で囲みます。次の例では、コマンドは必須の引数userを1つ定義しています。
1/**2 * The name and signature of the console command.3 *4 * @var string5 */6protected $signature = 'mail:send {user}';
引数をオプションにしたり、引数のデフォルト値を定義したりすることもできます。
1// Optional argument...2'mail:send {user?}'3 4// Optional argument with default value...5'mail:send {user=foo}'
オプション
オプションは、引数と同様に、ユーザー入力の別の形式です。オプションは、コマンドラインで指定されるときに2つのハイフン(--)が前に付きます。オプションには、値を受け取るものと受け取らないものの2つのタイプがあります。値を受け取らないオプションは、ブール値の「スイッチ」として機能します。このタイプのオプションの例を見てみましょう。
1/**2 * The name and signature of the console command.3 *4 * @var string5 */6protected $signature = 'mail:send {user} {--queue}';
この例では、Artisanコマンドを呼び出すときに--queueスイッチを指定できます。--queueスイッチが渡されると、オプションの値はtrueになります。それ以外の場合、値はfalseになります。
1php artisan mail:send 1 --queue
値を持つオプション
次に、値を期待するオプションを見てみましょう。ユーザーがオプションの値を指定する必要がある場合は、オプション名の末尾に=記号を付ける必要があります。
1/**2 * The name and signature of the console command.3 *4 * @var string5 */6protected $signature = 'mail:send {user} {--queue=}';
この例では、ユーザーは次のようにオプションの値を渡すことができます。コマンドを呼び出すときにオプションが指定されていない場合、その値はnullになります。
1php artisan mail:send 1 --queue=default
オプション名の後にデフォルト値を指定することで、オプションにデフォルト値を割り当てることができます。ユーザーがオプション値を渡さない場合、デフォルト値が使用されます。
1'mail:send {user} {--queue=default}'
オプションのショートカット
オプションを定義するときにショートカットを割り当てるには、オプション名の前に指定し、|文字を区切り文字として使用して、ショートカットと完全なオプション名を区切ります。
1'mail:send {user} {--Q|queue}'
ターミナルでコマンドを呼び出す際、オプションのショートカットにはハイフンを1つ付け、オプションに値を指定する際に=文字を含めないでください。
1php artisan mail:send 1 -Qdefault
入力配列
複数の入力値を期待する引数またはオプションを定義したい場合は、*文字を使用します。まず、そのような引数を指定する例を見てみましょう。
1'mail:send {user*}'
このメソッドを呼び出すとき、user引数をコマンドラインに順番に渡すことができます。たとえば、次のコマンドはuserの値を1と2を値として持つ配列に設定します。
1php artisan mail:send 1 2
この*文字は、オプションの引数定義と組み合わせて、引数のインスタンスが0個以上になるようにできます。
1'mail:send {user?*}'
オプション配列
複数の入力値を期待するオプションを定義する場合、コマンドに渡される各オプション値の前にオプション名を付ける必要があります。
1'mail:send {--id=*}'
このようなコマンドは、複数の--id引数を渡すことで呼び出すことができます。
1php artisan mail:send --id=1 --id=2
入力の説明
入力引数とオプションに説明を割り当てるには、引数名と説明をコロンで区切ります。コマンドを定義するのに少し余分なスペースが必要な場合は、定義を複数行に自由に広げてください。
1/**2 * The name and signature of the console command.3 *4 * @var string5 */6protected $signature = 'mail:send7 {user : The ID of the user}8 {--queue : Whether the job should be queued}';
入力が不足している場合のプロンプト
コマンドに必須の引数が含まれている場合、それらが提供されないとユーザーはエラーメッセージを受け取ります。あるいは、PromptsForMissingInputインターフェイスを実装することで、必須の引数が不足している場合に自動的にユーザーにプロンプトを表示するようにコマンドを設定することもできます。
1<?php 2 3namespace App\Console\Commands; 4 5use Illuminate\Console\Command; 6use Illuminate\Contracts\Console\PromptsForMissingInput; 7 8class SendEmails extends Command implements PromptsForMissingInput 9{10 /**11 * The name and signature of the console command.12 *13 * @var string14 */15 protected $signature = 'mail:send {user}';16 17 // ...18}
Laravelがユーザーから必須の引数を収集する必要がある場合、引数名または説明を使用してインテリジェントに質問を表現し、自動的にユーザーに引数を尋ねます。必須の引数を収集するために使用する質問をカスタマイズしたい場合は、promptForMissingArgumentsUsingメソッドを実装し、引数名をキーとする質問の配列を返します。
1/** 2 * Prompt for missing input arguments using the returned questions. 3 * 4 * @return array<string, string> 5 */ 6protected function promptForMissingArgumentsUsing(): array 7{ 8 return [ 9 'user' => 'Which user ID should receive the mail?',10 ];11}
質問とプレースホルダーを含むタプルを使用して、プレースホルダーテキストを提供することもできます。
1return [2 'user' => ['Which user ID should receive the mail?', 'E.g. 123'],3];
プロンプトを完全に制御したい場合は、ユーザーにプロンプトを表示して回答を返すクロージャを提供できます。
1use App\Models\User; 2use function Laravel\Prompts\search; 3 4// ... 5 6return [ 7 'user' => fn () => search( 8 label: 'Search for a user:', 9 placeholder: 'E.g. Taylor Otwell',10 options: fn ($value) => strlen($value) > 011 ? User::where('name', 'like', "%{$value}%")->pluck('name', 'id')->all()12 : []13 ),14];
包括的なLaravel Promptsのドキュメントには、利用可能なプロンプトとその使用法に関する追加情報が含まれています。
ユーザーにオプションを選択または入力するように促したい場合は、コマンドのhandleメソッドにプロンプトを含めることができます。ただし、不足している引数に対して自動的にプロンプトが表示された場合にのみユーザーにプロンプトを表示したい場合は、afterPromptingForMissingArgumentsメソッドを実装できます。
1use Symfony\Component\Console\Input\InputInterface; 2use Symfony\Component\Console\Output\OutputInterface; 3use function Laravel\Prompts\confirm; 4 5// ... 6 7/** 8 * Perform actions after the user was prompted for missing arguments. 9 */10protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void11{12 $input->setOption('queue', confirm(13 label: 'Would you like to queue the mail?',14 default: $this->option('queue')15 ));16}
コマンドI/O
入力の取得
コマンドの実行中、コマンドで受け入れられた引数とオプションの値にアクセスする必要があるでしょう。そのためには、argumentメソッドとoptionメソッドを使用できます。引数またはオプションが存在しない場合、nullが返されます。
1/**2 * Execute the console command.3 */4public function handle(): void5{6 $userId = $this->argument('user');7}
すべての引数をarrayとして取得する必要がある場合は、argumentsメソッドを呼び出します。
1$arguments = $this->arguments();
オプションは、optionメソッドを使用して引数と同じくらい簡単に取得できます。すべてのオプションを配列として取得するには、optionsメソッドを呼び出します。
1// Retrieve a specific option...2$queueName = $this->option('queue');3 4// Retrieve all options as an array...5$options = $this->options();
入力のプロンプト
Laravel Promptsは、プレースホルダーテキストやバリデーションなど、ブラウザのような機能を備えた、美しくユーザーフレンドリーなフォームをコマンドラインアプリケーションに追加するためのPHPパッケージです。
出力を表示するだけでなく、コマンドの実行中にユーザーに入力を提供するように求めることもできます。askメソッドは、指定した質問でユーザーにプロンプトを表示し、入力を受け入れ、ユーザーの入力をコマンドに返します。
1/**2 * Execute the console command.3 */4public function handle(): void5{6 $name = $this->ask('What is your name?');7 8 // ...9}
askメソッドは、ユーザー入力が提供されなかった場合に返されるべきデフォルト値を指定する、オプションの2番目の引数も受け入れます。
1$name = $this->ask('What is your name?', 'Taylor');
secretメソッドはaskに似ていますが、ユーザーがコンソールに入力する際、その入力は表示されません。このメソッドは、パスワードなどの機密情報を尋ねるときに役立ちます。
1$password = $this->secret('What is the password?');
確認を求める
ユーザーに簡単な「はい/いいえ」の確認を求める必要がある場合は、confirmメソッドを使用できます。デフォルトでは、このメソッドはfalseを返します。ただし、ユーザーがプロンプトに応答してyまたはyesを入力した場合、メソッドはtrueを返します。
1if ($this->confirm('Do you wish to continue?')) {2 // ...3}
必要であれば、confirmメソッドの第2引数にtrueを渡すことで、確認プロンプトがデフォルトでtrueを返すように指定できます。
1if ($this->confirm('Do you wish to continue?', true)) {2 // ...3}
オートコンプリート
anticipateメソッドは、考えられる選択肢のオートコンプリートを提供するために使用できます。ユーザーは、オートコンプリートのヒントに関係なく、任意の回答を提供できます。
1$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
または、anticipateメソッドの第2引数としてクロージャを渡すこともできます。このクロージャは、ユーザーが入力文字をタイプするたびに呼び出されます。クロージャは、これまでのユーザーの入力を含む文字列パラメータを受け入れ、オートコンプリートのオプションの配列を返す必要があります。
1$name = $this->anticipate('What is your address?', function (string $input) {2 // Return auto-completion options...3});
多肢選択式の質問
質問をするときにユーザーに事前に定義された選択肢のセットを与える必要がある場合は、choiceメソッドを使用できます。メソッドの第3引数としてインデックスを渡すことにより、オプションが選択されなかった場合に返されるデフォルト値の配列インデックスを設定できます。
1$name = $this->choice(2 'What is your name?',3 ['Taylor', 'Dayle'],4 $defaultIndex5);
さらに、choiceメソッドは、有効な応答を選択するための最大試行回数と、複数の選択が許可されるかどうかを決定するためのオプションの第4引数と第5引数を受け入れます。
1$name = $this->choice(2 'What is your name?',3 ['Taylor', 'Dayle'],4 $defaultIndex,5 $maxAttempts = null,6 $allowMultipleSelections = false7);
出力の書き込み
コンソールに出力を送信するには、line、info、comment、question、warn、およびerrorメソッドを使用できます。これらの各メソッドは、その目的に応じて適切なANSIカラーを使用します。たとえば、ユーザーにいくつかの一般的な情報を表示してみましょう。通常、infoメソッドはコンソールに緑色のテキストで表示されます。
1/**2 * Execute the console command.3 */4public function handle(): void5{6 // ...7 8 $this->info('The command was successful!');9}
エラーメッセージを表示するには、errorメソッドを使用します。エラーメッセージのテキストは通常、赤で表示されます。
1$this->error('Something went wrong!');
lineメソッドを使用して、プレーンで色付けされていないテキストを表示できます。
1$this->line('Display this on the screen');
newLineメソッドを使用して、空白行を表示できます。
1// Write a single blank line...2$this->newLine();3 4// Write three blank lines...5$this->newLine(3);
テーブル
tableメソッドを使用すると、複数の行/列のデータを正しくフォーマットするのが簡単になります。列名とテーブルのデータを提供するだけで、Laravelが自動的にテーブルの適切な幅と高さを計算します。
1use App\Models\User;2 3$this->table(4 ['Name', 'Email'],5 User::all(['name', 'email'])->toArray()6);
プログレスバー
長時間実行されるタスクの場合、タスクがどの程度完了したかをユーザーに知らせるプログレスバーを表示すると便利です。withProgressBarメソッドを使用すると、Laravelはプログレスバーを表示し、指定された反復可能な値の各反復でその進行状況を進めます。
1use App\Models\User;2 3$users = $this->withProgressBar(User::all(), function (User $user) {4 $this->performTask($user);5});
場合によっては、プログレスバーの進め方をより手動で制御する必要がある場合があります。まず、プロセスが反復するステップの総数を定義します。次に、各アイテムを処理した後にプログレスバーを進めます。
1$users = App\Models\User::all(); 2 3$bar = $this->output->createProgressBar(count($users)); 4 5$bar->start(); 6 7foreach ($users as $user) { 8 $this->performTask($user); 9 10 $bar->advance();11}12 13$bar->finish();
より高度なオプションについては、Symfony Progress Barコンポーネントのドキュメントをご覧ください。
コマンドの登録
デフォルトで、Laravelはapp/Console/Commandsディレクトリ内のすべてのコマンドを自動的に登録します。しかし、アプリケーションのbootstrap/app.phpファイルでwithCommandsメソッドを使用することで、Laravelに他のディレクトリもArtisanコマンドをスキャンするように指示できます。
1->withCommands([2 __DIR__.'/../app/Domain/Orders/Commands',3])
必要であれば、コマンドのクラス名をwithCommandsメソッドに渡すことで、コマンドを手動で登録することもできます。
1use App\Domain\Orders\Commands\SendEmails;2 3->withCommands([4 SendEmails::class,5])
Artisanが起動すると、アプリケーション内のすべてのコマンドがサービスコンテナによって解決され、Artisanに登録されます。
コマンドのプログラムによる実行
CLIの外部でArtisanコマンドを実行したい場合があります。たとえば、ルートやコントローラからArtisanコマンドを実行したい場合があります。これを実現するには、Artisanファサードのcallメソッドを使用します。callメソッドは、最初の引数としてコマンドのシグネチャ名またはクラス名のいずれかを受け入れ、2番目の引数としてコマンドパラメータの配列を受け入れます。終了コードが返されます。
1use Illuminate\Support\Facades\Artisan;2 3Route::post('/user/{user}/mail', function (string $user) {4 $exitCode = Artisan::call('mail:send', [5 'user' => $user, '--queue' => 'default'6 ]);7 8 // ...9});
あるいは、Artisanコマンド全体を文字列としてcallメソッドに渡すこともできます。
1Artisan::call('mail:send 1 --queue=default');
配列値の受け渡し
コマンドが配列を受け入れるオプションを定義している場合は、そのオプションに値の配列を渡すことができます。
1use Illuminate\Support\Facades\Artisan;2 3Route::post('/mail', function () {4 $exitCode = Artisan::call('mail:send', [5 '--id' => [5, 13]6 ]);7});
論理値の受け渡し
migrate:refreshコマンドの--forceフラグなど、文字列値を受け入れないオプションの値を指定する必要がある場合は、オプションの値としてtrueまたはfalseを渡す必要があります。
1$exitCode = Artisan::call('migrate:refresh', [2 '--force' => true,3]);
Artisanコマンドのキュー投入
Artisanファサードのqueueメソッドを使用すると、Artisanコマンドをキューに入れ、キューワーカーによってバックグラウンドで処理させることもできます。このメソッドを使用する前に、キューを設定し、キューリスナを実行していることを確認してください。
1use Illuminate\Support\Facades\Artisan;2 3Route::post('/user/{user}/mail', function (string $user) {4 Artisan::queue('mail:send', [5 'user' => $user, '--queue' => 'default'6 ]);7 8 // ...9});
onConnectionメソッドとonQueueメソッドを使用して、Artisanコマンドをディスパッチする接続またはキューを指定できます。
1Artisan::queue('mail:send', [2 'user' => 1, '--queue' => 'default'3])->onConnection('redis')->onQueue('commands');
他のコマンドからのコマンド呼び出し
既存のArtisanコマンドから他のコマンドを呼び出したい場合があります。これにはcallメソッドを使用します。このcallメソッドは、コマンド名とコマンドの引数/オプションの配列を受け取ります。
1/** 2 * Execute the console command. 3 */ 4public function handle(): void 5{ 6 $this->call('mail:send', [ 7 'user' => 1, '--queue' => 'default' 8 ]); 9 10 // ...11}
他のコンソールコマンドを呼び出して、その出力をすべて抑制したい場合は、callSilentlyメソッドを使用します。callSilentlyメソッドは、callメソッドと同じシグネチャを持っています。
1$this->callSilently('mail:send', [2 'user' => 1, '--queue' => 'default'3]);
シグナルハンドリング
ご存知のように、オペレーティングシステムでは実行中のプロセスにシグナルを送信できます。たとえば、SIGTERMシグナルは、オペレーティングシステムがプログラムに終了を要求する方法です。Artisanコンソールコマンドでシグナルをリッスンし、それらが発生したときにコードを実行したい場合は、trapメソッドを使用できます。
1/** 2 * Execute the console command. 3 */ 4public function handle(): void 5{ 6 $this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false); 7 8 while ($this->shouldKeepRunning) { 9 // ...10 }11}
一度に複数のシグナルをリッスンするには、trapメソッドにシグナルの配列を指定します。
1$this->trap([SIGTERM, SIGQUIT], function (int $signal) {2 $this->shouldKeepRunning = false;3 4 dump($signal); // SIGTERM / SIGQUIT5});
スタブのカスタマイズ
Artisanコンソールのmakeコマンドは、コントローラ、ジョブ、マイグレーション、テストなど、さまざまなクラスを作成するために使用されます。これらのクラスは、入力に基づいて値が設定される「スタブ」ファイルを使用して生成されます。しかし、Artisanによって生成されたファイルに小さな変更を加えたい場合があります。これを実現するには、stub:publishコマンドを使用して、最も一般的なスタブをアプリケーションにリソース公開し、カスタマイズできます。
1php artisan stub:publish
リソース公開されたスタブは、アプリケーションのルートにあるstubsディレクトリ内に配置されます。これらのスタブに加えた変更は、Artisanのmakeコマンドを使用して対応するクラスを生成するときに反映されます。
イベント
Artisanはコマンド実行時に3つのイベント、Illuminate\Console\Events\ArtisanStarting、Illuminate\Console\Events\CommandStarting、Illuminate\Console\Events\CommandFinishedをディスパッチします。ArtisanStartingイベントはArtisanの実行開始直後にディスパッチされます。次に、CommandStartingイベントがコマンド実行直前にディスパッチされます。最後に、コマンドの実行が終了すると、CommandFinishedイベントがディスパッチされます。