基本的な使用法

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@handle',
    ],
];

イベントハンドラーを生成するには、handler:event Artisan CLIコマンドを使用します。

php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased

ハンドラーやイベントが必要になるごとに毎回、make:eventhandler:eventコマンドを実行するのは、もちろん手間がかかります。代わりに、ハンドラーとイベントをEventServiceProviderに追加し、event:generateコマンドを使いましょう。このコマンドはEventServiceProviderにリストしてあるイベントやハンドラーを生成してくれます。

php artisan event:generate

イベントの発行

これで、Eventファサードを使用し、イベントを発行する用意ができました。

$response = Event::fire(new PodcastWasPurchased($podcast));

アプリケーションの中で、次に起きることをコントロールするために、fireメソッドはレスポンスの配列を返します。

イベントを起こすために、eventヘルパーを使用することもできます。

event(new PodcastWasPurchased($podcast));

クロージャーのリスナー

イベントを購読するために、独立したクラスを作成する必要は全くありません。例えば、EventServiceProviderbootメソッドの中で、以下のように指定できます。

Event::listen('App\Events\PodcastWasPurchased', function($event)
{
    // イベントの処理…
});

イベントの伝播を止める

場合により、イベントが他のリスナーへ伝播されるのを止めたいこともあります。ハンドラーから、falseを返してください。

Event::listen('App\Events\PodcastWasPurchased', function($event)
{
    // イベントの処理…

    return false;
});

キュー済みイベントハンドラー

イベントハンドラーを[キュー][queue](queues.html)に投入する必要があるのですか?ハンドラを生成する時に、--queuedフラッグを付けるだけです。

php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued

これにより、ハンドラクラスへIlluminate\Contracts\Queue\ShouldBeQueuedインターフェイスが実装されます。これだけです!これで、このハンドラーがイベントにより呼び出されると、イベントデスパッチャーにより自動的にキューへ投入されます。

キューされたハンドラーの実行時に、例外が投げられなければ、そのキューは処理後自動的に削除されます。もし、deletereleaseメソッドへ手動でアクセスする必要があれば、どうぞそうしてください。デフォルトでキューハンドラーに含まれている、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 array
     */
    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のIoCコンテナを使用し、購読クラスを依存解決したい場合もあるでしょう。その場合でも、ただsubscribeメソッドへ、購読クラスの登録名を渡すだけです。

Event::subscribe('UserEventHandler');