基本的な使用法

LaravelのEventクラスはシンプルなオブザーバの実装を提供します。アプリケーションの中でイベントを購読したり、リッスンするために使用します。

イベントを購読する

Event::listen('auth.login', function($user)
{
    $user->last_login = new DateTime;

    $user->save();
});

イベントを発行する

$response = Event::fire('auth.login', array($user));

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

優先度を指定し、イベントを購入する

イベントをリッスンする時に優先度を設定することもできます。高い優先度のリスナーは先に実行されます。同じ優先度のリスナーは登録した順番で実行されます。

Event::listen('auth.login', 'LoginHandler', 10);

Event::listen('auth.login', 'OtherHandler', 5);

イベントがそれ以上伝わるのを止める

イベントが他のリスナーに伝わるのを止めたい場合もあるでしょう。その場合、リスナー中でfalseをリターンしてください。

Event::listen('auth.login', function($event)
{
    // このイベントを処理する...

    return false;
});

どこでイベントを登録するか

これでイベントをどう登録するかを理解してもらえたと思います。しかし、どこで登録するのか迷っているんではないでしょうか。ご心配なく、よく尋ねられる質問です。残念ながら、答えを出すのは難しいのです。なぜなら、ほとんどどこででも登録できるからです! しかし、いくつかヒントはあります。イベントも、他の起動コードと同様に、app/start/global.phpのようなstartファイルのどれかで登録できます。

もしstartファイルが混雑したら、独立したapp/events.phpファイルを作成し、startファイルから読み込みこともできます。これは起動コードの他の部分と明確に分離してイベントを登録する簡単な手法です。

もしクラスベースのアプローチが好みであれば、サービスプロバイダーの中で登録して下さい。本質的にどのアプローチが「正しい」というものではなく、アプリケーションのサイズに基づき、皆さんが好ましいと感じるアプローチを選んで下さい。

ワイルドカードリスナー

ワイルドカードイベントリスナーを登録する

イベントリスナーを登録する時、アスタリスクを用い、ワイルドカードリスナーを指定することができます。

Event::listen('foo.*', function($param)
{
    // このイベントを処理する...
});

この場合、リスナーはfoo.で始まるイベント全部を処理します。

実際にどのイベントが発行されたのかを調べるために、Event::firedメソッドが使用できます。

Event::listen('foo.*', function($param)
{
    if (Event::firing() == 'foo.bar')
    {
        //
    }
});

リスナークラスを使用する

イベントハンドラーにクロージャーではなく、クラスを使用したい場合もあるでしょう。クラスのイベントハンドラーはLaravelのIoCコンテナによりインスタンスが解決され、これによりリスナーに依存性を注入できる利点があります。

クラスリスナーを登録する

Event::listen('auth.login', 'LoginHandler');

イベントリスナークラスを定義する

デフォルトでは、LoginHandlerクラスのhandleメソッドが呼び出されます。

class LoginHandler {

    public function handle($data)
    {
        //
    }

}

リッスンに使用するメソッドを指定する

もしデフォルトのhandleメソッドを使用したくないのでしたら、使用するメソッドを指定してください。

Event::listen('auth.login', 'LoginHandler@onLogin');

イベントキュー

イベントキューに登録する

queueflushメソッドで、イベントを発行させる"キュー"に登録することができますが、即時に発行されるわけではありません。

Event::queue('foo', array($user));

フラッシャーを実行し、全てのキューイベントをフラッシュするにはflushメソッドを使用してください。

Event::flush('foo');

イベント購読クラス

イベント購読クラスを定義する

イベント購読クラスは一つのクラスで多くのイベントをリッスンするためのものです。購買クラスは、イベントデスパッチャーインスタンスが渡されるsubscribeメソッドを実装しなくてはなりません。

class UserEventHandler {

    /**
     * ユーザーログインイベント処理
     */
    public function onUserLogin($event)
    {
        //
    }

    /**
     * ユーザーログアウトイベント処理
     */
    public function onUserLogout($event)
    {
        //
    }

    /**
     * イベント購入リスナーの登録
     *
     * @param  Illuminate\Events\Dispatcher  $events
     * @return array
     */
    public function subscribe($events)
    {
        $events->listen('auth.login', 'UserEventHandler@onUserLogin');

        $events->listen('auth.logout', 'UserEventHandler@onUserLogout');
    }

}

イベント購入クラスを登録する

イベント購読クラスを定義したら、Eventクラスで登録しましょう。

$subscriber = new UserEventHandler;

Event::subscribe($subscriber);

また、LaravelのIoCコンテナを使用し、購読クラスを解決したい場合もあるでしょう。その場合でも、ただsubscribeメソッドへ、購読クラスの登録名を渡すだけです。

Event::subscribe('UserEventHandler');