回到最上方

文件

事件

基本使用

Laravel 的 Event 類別提供一個簡單的觀察者實作,允許你訂閱及傾聽你應用程式的事件。

訂閱事件

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

    $user->save();
});

觸發事件

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

你也可以指定訂閱事件的優先順序,有更高優先等級傾聽器會先被執行,如果有相同優先等級的傾聽器,將會依照事件訂閱順序依序執行。

訂閱有優先等級的事件

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

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

有時候,你也需希望能夠停止擴散事件到其他事件傾聽器,你可以在你的傾聽器中回傳 false 達到停止擴散的目的:

停止傳遞事件

Event::listen('user.login', function($event)
{
    // Handle the event...

    return false;
});

萬用字元傾聽器

你可以使用萬用字元 (*) 去註冊事件傾聽器:

註冊萬用字元事件傾聽器

Event::listen('foo.*', function($param, $event)
{
    // Handle the event...
});

這個傾聽器將會處理所有開頭為 foo. 的所有事件,注意到,完整的事件名稱,將會當作最後一個參數,傳給送處理器。

使用類別傾聽器

在某些例子中,你可能希望使用一個類別去處理事件,而不是用閉合函式,類別事件傾聽器將會在 Laravel IoC container 中被處理,提供一個完整強大的相依性,注入在你的傾聽器中。

註冊事件傾聽器類別

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

預設,在 LoginHandler 類別的 handle 方法將會被呼叫:

定義事件傾聽器類別

class LoginHandler {

    public function handle($data)
    {
        //
    }

}

假如你不希望使用預設 handle 方法,你可以在訂閱事件中,指定要執行的方法:

指定訂閱事件的方法

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

佇列事件

使用 queueflush 方法,你可以不要立即觸發事件,將事件存放在 "佇列" 中,等著之後再被觸發:

註冊一個佇列事件

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

註冊一個事件清除器

Event::flusher('foo', function($user)
{
    //
});

最後,你可以使用 flush 方法,執行 "事件清除器" 去清除所有被 "佇列" 的事件:

Event::flush('foo');

事件訂閱

事件訂閱是類別時,可以在類別中訂閱數個事件,訂閱者應定義 subscribe 方法,此方法將會被事件分配器實例傳遞:

定義事件訂閱者

class UserEventHandler {

    /**
     * Handle user login events.
     */
    public function onUserLogin($event)
    {
        //
    }

    /**
     * Handle user logout events.
     */
    public function onUserLogout($event)
    {
        //
    }

    /**
     * Register the listeners for the subscriber.
     *
     * @param  Illuminate\Events\Dispatcher  $events
     * @return array
     */
    public function subscribe($events)
    {
        $events->listen('user.login', 'UserEventHandler@onUserLogin');

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

}

只要訂閱者被定義,此事件將會在 Event 類別中被註冊。

註冊事件訂閱者

$subscriber = new UserEventHandler;

Event::subscribe($subscriber);

討論