事件

2018-12-17 10:51 更新

基本用法

Laravel 的 event 功能提供一個簡單的觀察者實現(xiàn),允許你在應(yīng)用程序里訂閱與監(jiān)聽事件。事件類通常被保存在 app/Events 目錄下,而它們的處理程序則被保存在 app/Handlers/Events 目錄下。

你可以使用 Artisan 命令行工具產(chǎn)生一個新的事件類:

php artisan make:event PodcastWasPurchased

           

訂閱事件

Laravel 里的 EventServiceProvider 提供了一個方便的地方注冊所有的事件處理程序。listen 屬性包含一個所有的事件 (鍵) 和相對應(yīng)的處理程序 (值) 的 數(shù)組。當(dāng)然,你可以依應(yīng)用程序的需求添加任何數(shù)量的事件到這個數(shù)組。舉個例子,讓我們來加上 PodcastWasPurchased 事件:

/**
 * 應(yīng)用程序的事件處理程序?qū)φ铡? *
 * @var array
 */protected $listen = [
    'App\Events\PodcastWasPurchased' => [
        'App\Handlers\Events\EmailPurchaseConfirmation',
    ],];

           

使用 Artisan 命令行命令 handler:event,來產(chǎn)生一個事件的處理程序:

php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased

           

當(dāng)然,在每次你需要一個處理程序或是事件時,手動地執(zhí)行 make:eventhandler:event 命令很麻煩。作為替代,簡單地添加處理程序跟事件到你的 EventServiceProvider 并使用 event:generate 命令。這個命令將會產(chǎn)生任何在你的 EventServiceProvider 列出的事件跟處理程序:

php artisan event:generate

           

觸發(fā)事件

現(xiàn)在我們準(zhǔn)備好使用 Event facade 觸發(fā)我們的事件:

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

           

fire 方法返回一個響應(yīng)的數(shù)組,讓你可以用來控制你的應(yīng)用程序接下來要有什么反應(yīng)。

你也可以使用 event 輔助方法來觸發(fā)事件:

event(new PodcastWasPurchased($podcast));

           

監(jiān)聽器閉包

你甚至可以不需對事件建立對應(yīng)的處理類。舉個例子,在你的 EventServiceProviderboot 方法里,你可以做下面這件事:

Event::listen('App\Events\PodcastWasPurchased', function($event){
    // 處理事件...});

           

停止繼續(xù)傳遞事件

有時候你會希望停止繼續(xù)傳遞事件到其他監(jiān)聽器。你可以通過從處理程序返回 false 來做到這件事:

Event::listen('App\Events\PodcastWasPurchased', function($event){
    // 處理事件...
    return false;});

           

           

事件處理隊列

需要把事件處理程序放到 隊列 嗎?這不能變得再更簡單了。當(dāng)你產(chǎn)生處理程序,簡單地使用 --queued 旗標(biāo):

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

           

這將會產(chǎn)生一個實現(xiàn)了 Illuminate\Contracts\Queue\ShouldBeQueued 接口的處理程序類。這樣就可以了!現(xiàn)在當(dāng)這個處理程序因為事件發(fā)生被調(diào)用,它將會被事件配送器自動地排進隊列。

當(dāng)處理程序被隊列執(zhí)行,如果沒有異常被丟出,在執(zhí)行后該隊列中的任務(wù)將會自動被刪除。你也可以手動取用隊列中的任務(wù)的 deleterelease 方法。隊列處理程序默認會引入的 Illuminate\Queue\InteractsWithQueue trait,讓你可以取用這些方法:

public function handle(PodcastWasPurchased $event){
    if (true)
    {
        $this->release(30);
    }}

           

如果你想要把一個已存在的處理程序轉(zhuǎn)換成一個隊列的處理程序,簡單地手動添加 ShouldBeQueued 接口到類。

           

事件訂閱者

定義事件訂閱者

事件訂閱者是個可以從類自身里面訂閱多個事件的類。訂閱者應(yīng)該定義 subscribe 方法,事件配送器實體將會被傳遞到這個方法:

class UserEventHandler {

    /**
     * 處理用戶登錄事件。
     */
    public function onUserLogin($event)
    {
        //    }

    /**
     * 處理用戶注銷事件。
     */
    public function onUserLogout($event)
    {
        //    }

    /**
     * 注冊監(jiān)聽器給訂閱者。
     *
     * @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');
    }}

           

注冊事件訂閱者

當(dāng)定義了訂閱者后,可以使用 Event 類注冊。

$subscriber = new UserEventHandler;Event::subscribe($subscriber);

           

你也可以使用 服務(wù)容器 自動解析訂閱者。簡單地傳遞訂閱者的名字給 subscribe 方法就可以做到:

Event::subscribe('UserEventHandler');


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號