事件
基本使用
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');
佇列事件
使用 queue
及 flush
方法,你可以不要立即觸發事件,將事件存放在 "佇列" 中,等著之後再被觸發:
註冊一個佇列事件
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);