基本的な使用法
Laravelのイベント機能は、オブザーバのシンプルな実装を提供します。アプリケーションの中でイベントを発行し、購読するために使用します。イベントクラスは通常、app/Events
ディレクトリーへ保存され、ハンドラーはapp/Handlers/Events
に設置します。
新しいイベンクラスは、Artisan CLIツールを使用して生成します。
php artisan make:event PodcastWasPurchased
イベントを購読する
Laravelアプリケーションに含まれているEventServiceProvider
は、イベントハンドラーを全部登録するために便利な手段を提供しています。listen
プロパティは全イベント(キー)とハンドラー(値)で構成されている配列です。もちろん、アプリケーションで必要とされているイベントをこの配列に好きなだけ追加できます。例えば、PodcastWasPurchased
イベントを追加してみましょう。
/**
* アプリケーションのイベントハンドラーをマップする
*
* @var array
*/
protected $listen = [
'App\Events\PodcastWasPurchased' => [
'App\Handlers\Events\EmailPurchaseConfirmation',
],
];
イベントハンドラーを生成するには、handler:event
Artisan
CLIコマンドを使用します。
php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased
ハンドラーやイベントが必要になるごとに毎回、make:event
やhandler:event
コマンドを実行するのは、もちろん手間がかかります。代わりに、ハンドラーとイベントをEventServiceProvider
に追加し、event:generate
コマンドを使いましょう。このコマンドはEventServiceProvider
にリストしてあるイベントやハンドラーを生成してくれます。
php artisan event:generate
イベントの発行
これでEvent
ファサードを使用し、イベントを発行する用意ができました。
$response = Event::fire(new PodcastWasPurchased($podcast));
アプリケーションの中で、次に何を起こすかをコントロールするために、fire
メソッドはレスポンスの配列を返します。
イベントを起こすために、event
ヘルパを使用することもできます。
event(new PodcastWasPurchased($podcast));
クロージャーのリスナー
イベントを購読するために、独立したクラスを作成する必要は全くありません。例えば、EventServiceProvider
のboot
メソッドの中で、以下のように指定できます。
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
// イベントの処理…
});
イベントの伝播の停止
場合により、イベントが他のリスナーへ伝播されるのを止めたいこともあります。ハンドラーから、false
を返してください。
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
// イベントの処理…
return false;
});
キュー済みイベントハンドラー
イベントハンドラーをキューに投入する必要があるのですか?ハンドラーを生成する時に、--queued
フラッグを付けるだけです。
php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued
これにより、ハンドラークラスへIlluminate\Contracts\Queue\ShouldBeQueued
インターフェイスが実装されます。これだけです!これで、このハンドラーがイベントにより呼び出されると、イベントデスパッチャーにより自動的にキューへ投入されます。
キューされたハンドラーの実行時に、例外が投げられなければ、そのキューは処理後自動的に削除されます。もし、delete
やrelease
メソッドへ手動でアクセスする必要があるのなら、どうぞそうしてください。デフォルトでキューハンドラーに含まれている、Illuminate\Queue\InteractsWithQueue
トレイトが、そうしたメソッドへのアクセスを提供しています。
public function handle(PodcastWasPurchased $event)
{
if (true)
{
$this->release(30);
}
}
既に存在しているハンドラーをキューへ投入するハンドラーに変更したい場合は、ShouldBeQueued
インターフェイスをそのクラスに追加するだけです。
イベント購読クラス
イベント購読クラスの定義
イベント購読クラスは一つのクラスで多くのイベントを購読するためのものです。購読クラスは、イベントデスパッチャーインスタンスが渡されるsubscribe
メソッドを実装しなくてはなりません。
class UserEventHandler {
/**
* ユーザーログインイベントの処理
*/
public function onUserLogin($event)
{
//
}
/**
* ユーザーログアウトイベントの処理
*/
public function onUserLogout($event)
{
//
}
/**
* イベント購入リスナーの登録
*
* @param Illuminate\Events\Dispatcher $events
* @return void
*/
public function subscribe($events)
{
$events->listen('App\Events\UserLoggedIn', 'UserEventHandler@onUserLogin');
$events->listen('App\Events\UserLoggedOut', 'UserEventHandler@onUserLogout');
}
}
イベント購読クラスの登録
イベント購読クラスを定義したら、Event
クラスで登録しましょう。
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
また、Laravelのサービスコンテナを使用し、購読クラスを依存解決したい場合もあるでしょう。その場合でもsubscribe
メソッドへ、購読クラスの登録名を渡すだけです。
Event::subscribe('UserEventHandler');