解析Laravel事件系統的使用方法

下面由laravel教程欄目帶大家介紹關于laravel事件系統的使用方法,希望對大家有所幫助!

Laravel 事件系統用法總結

Laravel 的事件提供了一個簡單的觀察者實現,能夠訂閱和監聽應用中發生的各種事件。事件類保存在 app/Events 目錄中,而這些事件的的監聽器則被保存在 app/Listeners 目錄下。這些目錄只有當你使用 Artisan 命令來生成事件和監聽器時才會被自動創建。

事件機制是一種很好的應用解耦方式,因為一個事件可以擁有多個互不依賴的監聽器。例如,如果你希望每次訂單發貨時向用戶發送一個 Slack 通知。你可以簡單地發起一個 OrderShipped 事件,讓監聽器接收之后轉化成一個 Slack 通知,這樣你就可以不用把訂單的業務代碼跟 Slack 通知的代碼耦合在一起了。

生成一個事件類

比如通過 artisan 命令生成一個 UserLogin 事件:

php?artisan?make:event?UserLogin

在 app/Events 中就會自動生成一個 UserLogin.php 文件,內容不多,如下:

<?php   namespace AppEvents;   use IlluminateBroadcastingChannel; use IlluminateQueueSerializesModels; use IlluminateBroadcastingPrivateChannel; use IlluminateBroadcastingPresenceChannel; use IlluminateBroadcastingInteractsWithSockets; use IlluminateContractsBroadcastingShouldBroadcast;   class UserLogin {     use InteractsWithSockets, SerializesModels;       /**      * Create a new event instance.      *      * @return void      */     public function __construct()     {         //     }       /**      * Get the channels the event should broadcast on.      *      * @return Channel|array      */     public function broadcastOn()     {         return new PrivateChannel(&#39;channel-name&#39;);     } }

定義監聽器

一個事件可以被一個或多個監聽器監聽,也就是觀察者模式,我們可以定義多個監聽器,當這個事件發生,執行一系列邏輯。

在 EventServiceProvider 的 $listen 中可以定義事件和監聽器,如下:

protected?$listen?=?[ ????'AppEventsUserLogin'?=&gt;?[ ????????'AppListenersDoSomething1', ????????'AppListenersDosomething2', ????], ];

然后執行 artisan 命令,就可以自動在 app/Listeners 目錄生成監聽器。

php?artisan?event:generate

可以看到 app/Listeners 目錄多了 DoSomething1.php 和 DoSomething2.php 兩個文件,我們看看其中一個內容:

<?php   namespace AppListeners;   use AppEventsUserLogin; use IlluminateQueueInteractsWithQueue; use IlluminateContractsQueueShouldQueue;   class DoSomething1 {     /**      * Create the event listener.      *      * @return void      */     public function __construct()     {         //     }       /**      * Handle the event.      *      * @param  UserLogin  $event      * @return void      */     public function handle(UserLogin $event)     {         info(&#39;do something1&#39;);     } }

在兩個監聽器的 handle 方法中我們打印一個日志來測試一下,如代碼 handle 方法所示。

分發和觸發事件

我們在某個控制器的方法中來分發事件,也就是觸發事件,看監聽器是否正常工作。

就是一句話:

event(new?UserLogin());

然后我們請求這個控制器,觀察日志,發現打印了日志:

[2018-06-17?10:04:29]?local.INFO:?do?something1?[2018-06-17?10:04:29]?local.INFO:?do?something2

那么這個事件-監聽機制就正常工作了。

隊列異步處理

如果某個監聽器需要執行的操作比較慢,可以放到消息隊列進行異步處理。

比如把上面的 DoSomething1 改成需要放入隊列的,只需要 implements ShoulQueue 接口。

class?DoSomething1?implements?ShouldQueue

也可以指定隊列驅動,如下代碼。

/** ?????*?任務應該發送到的隊列的連接的名稱 ?????* ?????*?@var?string|null ?????*/ ????public?$connection?=?'redis'; ? ????/** ?????*?任務應該發送到的隊列的名稱 ?????* ?????*?@var?string|null ?????*/ ????public?$queue?=?'listeners';

我們再次執行控制器方法。

日志里沒有打印 do something1,只有 do something2,但是在 redis 隊列里發現了一個名為 queues:default 的列表。

{"job":"IlluminateEventsCallQueuedHandler@call","data":{"class":"AppListenersDoSomething1","method":"handle","data":"a:1:{i:0;O:20:"AppEventsUserLogin":1:{s:6:"socket";N;}}"},"id":"3D7VDUwueYGtUvsazicWsifwWQxnnLID","attempts":1}

這個時候需要使用 php artisan queue:work 執行隊列任務,才是真正執行 DoSomething1 這個監聽器的 handle 方法。

相關推薦:最新的五個Laravel視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享