イベント
はじめに
Laravelのイベントはシンプルなオブザーバーパターンの実装を提供し、アプリケーション内で発生するさまざまなイベントに対して購読およびリスニングすることができます。イベントクラスは通常、app/Events
ディレクトリに保存され、そのリスナーはapp/Listeners
に保存されます。これらのディレクトリがアプリケーション内に表示されない場合でも心配しないでください。Artisanコンソールコマンドを使用してイベントとリスナーを生成すると、これらが自動的に作成されます。
イベントはアプリケーションのさまざまな側面を分離する素晴らしい方法として機能します。単一のイベントには、互いに依存しない複数のリスナーが存在できます。たとえば、注文が出荷されるたびにユーザーにSlack通知を送信したい場合があります。注文処理コードをSlack通知コードに結合する代わりに、App\Events\OrderShipped
イベントを発生させ、リスナーが受信してSlack通知を送信するために使用できます。
イベントとリスナーの生成
イベントとリスナーを素早く生成するために、make:event
および make:listener
Artisan コマンドを使用することができます:
php artisan make:event PodcastProcessed
php artisan make:listener SendPodcastNotification --event=PodcastProcessed
便宜上、追加の引数なしで make:event
および make:listener
Artisan コマンドを呼び出すこともできます。この場合、Laravel は自動的にクラス名と、リスナーを作成する際にリッスンすべきイベントをプロンプトで尋ねます:
php artisan make:event
php artisan make:listener
イベントとリスナーの登録
イベントの検出
デフォルトでは、Laravel はアプリケーションの Listeners
ディレクトリをスキャンしてイベントリスナーを自動的に検出および登録します。Laravel は、handle
または __invoke
で始まるリスナークラスのメソッドを見つけると、そのメソッドをイベントリスナーとして登録します。メソッドのシグネチャで型ヒントされたイベントに対して:
use App\Events\PodcastProcessed;
class SendPodcastNotification
{
/**
* Handle the given event.
*/
public function handle(PodcastProcessed $event): void
{
// ...
}
}
リスナーを異なるディレクトリに保存したり、複数のディレクトリ内に保存する場合、bootstrap/app.php
ファイル内で withEvents
メソッドを使用して、Laravel にこれらのディレクトリをスキャンするよう指示することができます:
->withEvents(discover: [
__DIR__.'/../app/Domain/Listeners',
])
event:list
コマンドを使用して、アプリケーションに登録されているすべてのリスナーをリストアップすることができます:
php artisan event:list