Introduction

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

  1. php artisan list

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

  1. php 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です。

Installation

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

  1. composer require laravel/tinker

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

Usage

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

  1. php artisan tinker

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

  1. php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
  1. <a name="command-allow-list"></a>
  2. #### Command Allow List
  3. Tinkerは、Artisanコマンドがそのシェル内で実行できるかどうかを判断するために「許可」リストを利用します。デフォルトでは、`````clear-compiled`````、`````down`````、`````env`````、`````inspire`````、`````migrate`````、`````migrate:install`````、`````up`````、`````optimize`````コマンドを実行できます。さらにコマンドを許可したい場合は、`````commands`````配列に追加できます。`````tinker.php`````設定ファイル:
  4. ``````php
  5. 'commands' => [
  6. // App\Console\Commands\ExampleCommand::class,
  7. ],
  8. `

Classes That Should Not Be Aliased

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

  1. 'dont_alias' => [
  2. App\Models\User::class,
  3. ],

Writing Commands

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

Generating Commands

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

  1. php artisan make:command SendEmails

Command Structure

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

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

  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Models\User;
  4. use App\Support\DripEmailer;
  5. use Illuminate\Console\Command;
  6. class SendEmails extends Command
  7. {
  8. /**
  9. * The name and signature of the console command.
  10. *
  11. * @var string
  12. */
  13. protected $signature = 'mail:send {user}';
  14. /**
  15. * The console command description.
  16. *
  17. * @var string
  18. */
  19. protected $description = 'Send a marketing email to a user';
  20. /**
  21. * Execute the console command.
  22. */
  23. public function handle(DripEmailer $drip): void
  24. {
  25. $drip->send(User::find($this->argument('user')));
  26. }
  27. }

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

Exit Codes

  1. ``````php
  2. $this->error('Something went wrong.');
  3. return 1;
  4. `

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

  1. $this->fail('Something went wrong.');

Closure Commands

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

  1. ``````php
  2. Artisan::command('mail:send {user}', function (string $user) {
  3. $this->info("Sending email to: {$user}!");
  4. });
  5. `

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

Type-Hinting Dependencies

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

  1. use App\Models\User;
  2. use App\Support\DripEmailer;
  3. Artisan::command('mail:send {user}', function (DripEmailer $drip, string $user) {
  4. $drip->send(User::find($user));
  5. });

Closure Command Descriptions

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

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

Isolatable Commands

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

時には、コマンドのインスタンスが同時に1つだけ実行できることを確認したい場合があります。これを実現するには、コマンドクラスでIlluminate\Contracts\Console\Isolatableインターフェースを実装します:

  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Contracts\Console\Isolatable;
  5. class SendEmails extends Command implements Isolatable
  6. {
  7. // ...
  8. }

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

  1. php artisan mail:send 1 --isolated

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

  1. php artisan mail:send 1 --isolated=12

Lock ID

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

  1. /**
  2. * Get the isolatable ID for the command.
  3. */
  4. public function isolatableId(): string
  5. {
  6. return $this->argument('user');
  7. }

Lock Expiration Time

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

  1. use DateTimeInterface;
  2. use DateInterval;
  3. /**
  4. * Determine when an isolation lock expires for the command.
  5. */
  6. public function isolationLockExpiresAt(): DateTimeInterface|DateInterval
  7. {
  8. return now()->addMinutes(5);
  9. }

Defining Input Expectations

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

Arguments

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

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

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

  1. // Optional argument...
  2. 'mail:send {user?}'
  3. // Optional argument with default value...
  4. 'mail:send {user=foo}'

Options

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

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

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

  1. php artisan mail:send 1 --queue

Options With Values

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

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

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

  1. php artisan mail:send 1 --queue=default

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

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

Option Shortcuts

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

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

ターミナルでコマンドを呼び出すとき、オプションショートカットは単一のハイフンで接頭辞が付けられ、オプションの値を指定するときに=文字は含めないでください:

  1. php artisan mail:send 1 -Qdefault

Input Arrays

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

  1. 'mail:send {user*}'

このメソッドを呼び出すとき、user引数をコマンドラインに順番に渡すことができます。たとえば、次のコマンドはuserの値を12を値とする配列に設定します:

  1. php artisan mail:send 1 2

この*文字は、引数のオプション定義と組み合わせて、引数のインスタンスを0個以上許可することができます:

  1. 'mail:send {user?*}'

Option Arrays

複数の入力値を期待するオプションを定義する場合、コマンドに渡される各オプション値はオプション名で接頭辞が付けられる必要があります:

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

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

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

Input Descriptions

入力引数やオプションに説明を割り当てるには、引数名と説明をコロンで区切ります。コマンドを定義するために少し余分なスペースが必要な場合は、定義を複数行に分けて記述してください:

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

Prompting for Missing Input

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

  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Contracts\Console\PromptsForMissingInput;
  5. class SendEmails extends Command implements PromptsForMissingInput
  6. {
  7. /**
  8. * The name and signature of the console command.
  9. *
  10. * @var string
  11. */
  12. protected $signature = 'mail:send {user}';
  13. // ...
  14. }

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

  1. /**
  2. * Prompt for missing input arguments using the returned questions.
  3. *
  4. * @return array<string, string>
  5. */
  6. protected function promptForMissingArgumentsUsing(): array
  7. {
  8. return [
  9. 'user' => 'Which user ID should receive the mail?',
  10. ];
  11. }

質問とプレースホルダを含むタプルを使用してプレースホルダテキストを提供することもできます:

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

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

  1. use App\Models\User;
  2. use function Laravel\Prompts\search;
  3. // ...
  4. return [
  5. 'user' => fn () => search(
  6. label: 'Search for a user:',
  7. placeholder: 'E.g. Taylor Otwell',
  8. options: fn ($value) => strlen($value) > 0
  9. ? User::where('name', 'like', "%{$value}%")->pluck('name', 'id')->all()
  10. : []
  11. ),
  12. ];

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

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

  1. use Symfony\Component\Console\Input\InputInterface;
  2. use Symfony\Component\Console\Output\OutputInterface;
  3. use function Laravel\Prompts\confirm;
  4. // ...
  5. /**
  6. * Perform actions after the user was prompted for missing arguments.
  7. */
  8. protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void
  9. {
  10. $input->setOption('queue', confirm(
  11. label: 'Would you like to queue the mail?',
  12. default: $this->option('queue')
  13. ));
  14. }

Command I/O

Retrieving Input

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

  1. /**
  2. * Execute the console command.
  3. */
  4. public function handle(): void
  5. {
  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. // Retrieve all options as an array...
  4. $options = $this->options();

Prompting for Input

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

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

  1. /**
  2. * Execute the console command.
  3. */
  4. public function handle(): void
  5. {
  6. $name = $this->ask('What is your name?');
  7. // ...
  8. }
  1. ``````php
  2. $name = $this->ask('What is your name?', 'Taylor');
  3. `
  1. ``````php
  2. $password = $this->secret('What is the password?');
  3. `

Asking for Confirmation

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

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

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

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

Auto-Completion

  1. ``````php
  2. $name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
  3. `

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

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

Multiple Choice Questions

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

  1. $name = $this->choice(
  2. 'What is your name?',
  3. ['Taylor', 'Dayle'],
  4. $defaultIndex
  5. );

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

  1. $name = $this->choice(
  2. 'What is your name?',
  3. ['Taylor', 'Dayle'],
  4. $defaultIndex,
  5. $maxAttempts = null,
  6. $allowMultipleSelections = false
  7. );

Writing Output

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

  1. /**
  2. * Execute the console command.
  3. */
  4. public function handle(): void
  5. {
  6. // ...
  7. $this->info('The command was successful!');
  8. }

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

  1. $this->error('Something went wrong!');
  1. ``````php
  2. $this->line('Display this on the screen');
  3. `
  1. ``````php
  2. // Write a single blank line...
  3. $this->newLine();
  4. // Write three blank lines...
  5. $this->newLine(3);
  6. `

Tables

  1. ``````php
  2. use App\Models\User;
  3. $this->table(
  4. ['Name', 'Email'],
  5. User::all(['name', 'email'])->toArray()
  6. );
  7. `

Progress Bars

長時間実行されるタスクでは、タスクの完了度をユーザーに知らせるプログレスバーを表示することが役立ちます。withProgressBarメソッドを使用すると、Laravelはプログレスバーを表示し、指定された反復値ごとに進捗を進めます:

  1. use App\Models\User;
  2. $users = $this->withProgressBar(User::all(), function (User $user) {
  3. $this->performTask($user);
  4. });

時には、プログレスバーの進行方法を手動で制御する必要があります。まず、プロセスが反復する総ステップ数を定義します。次に、各アイテムを処理した後にプログレスバーを進めます:

  1. $users = App\Models\User::all();
  2. $bar = $this->output->createProgressBar(count($users));
  3. $bar->start();
  4. foreach ($users as $user) {
  5. $this->performTask($user);
  6. $bar->advance();
  7. }
  8. $bar->finish();

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

Registering Commands

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

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

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

  1. use App\Domain\Orders\Commands\SendEmails;
  2. ->withCommands([
  3. SendEmails::class,
  4. ])

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

Programmatically Executing Commands

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

  1. use Illuminate\Support\Facades\Artisan;
  2. Route::post('/user/{user}/mail', function (string $user) {
  3. $exitCode = Artisan::call('mail:send', [
  4. 'user' => $user, '--queue' => 'default'
  5. ]);
  6. // ...
  7. });

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

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

Passing Array Values

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

  1. use Illuminate\Support\Facades\Artisan;
  2. Route::post('/mail', function () {
  3. $exitCode = Artisan::call('mail:send', [
  4. '--id' => [5, 13]
  5. ]);
  6. });

Passing Boolean Values

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

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

Queueing Artisan Commands

  1. ``````php
  2. use Illuminate\Support\Facades\Artisan;
  3. Route::post('/user/{user}/mail', function (string $user) {
  4. Artisan::queue('mail:send', [
  5. 'user' => $user, '--queue' => 'default'
  6. ]);
  7. // ...
  8. });
  9. `
  1. ``````php
  2. Artisan::queue('mail:send', [
  3. 'user' => 1, '--queue' => 'default'
  4. ])->onConnection('redis')->onQueue('commands');
  5. `

Calling Commands From Other Commands

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

  1. /**
  2. * Execute the console command.
  3. */
  4. public function handle(): void
  5. {
  6. $this->call('mail:send', [
  7. 'user' => 1, '--queue' => 'default'
  8. ]);
  9. // ...
  10. }

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

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

Signal Handling

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

  1. /**
  2. * Execute the console command.
  3. */
  4. public function handle(): void
  5. {
  6. $this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false);
  7. while ($this->shouldKeepRunning) {
  8. // ...
  9. }
  10. }

複数の信号を同時にリッスンするには、trapメソッドに信号の配列を提供できます:

  1. $this->trap([SIGTERM, SIGQUIT], function (int $signal) {
  2. $this->shouldKeepRunning = false;
  3. dump($signal); // SIGTERM / SIGQUIT
  4. });

Stub Customization

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

  1. php artisan stub:publish

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

Events

Artisanはコマンドを実行する際に3つのイベントを発行します:Illuminate\Console\Events\ArtisanStartingIlluminate\Console\Events\CommandStarting、およびIlluminate\Console\Events\CommandFinishedArtisanStartingイベントは、Artisanが実行を開始したときに即座に発行されます。次に、CommandStartingイベントは、コマンドが実行される直前に即座に発行されます。最後に、CommandFinishedイベントは、コマンドの実行が完了したときに発行されます。