91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel事件系統怎么用

發布時間:2021-10-27 16:52:44 來源:億速云 閱讀:127 作者:小新 欄目:編程語言

這篇文章主要介紹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 App\Events;
 
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
 
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('channel-name');
    }
}

定義監聽器

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

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

protected $listen = [
    'App\Events\UserLogin' => [
        'App\Listeners\DoSomething1',
        'App\Listeners\Dosomething2',
    ],
];

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

php artisan event:generate

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

<?php
 
namespace App\Listeners;
 
use App\Events\UserLogin;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
 
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('do something1');
    }
}

在兩個監聽器的 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":"Illuminate\\Events\\CallQueuedHandler@call","data":{"class":"App\\Listeners\\DoSomething1","method":"handle","data":"a:1:{i:0;O:20:\"App\\Events\\UserLogin\":1:{s:6:\"socket\";N;}}"},"id":"3D7VDUwueYGtUvsazicWsifwWQxnnLID","attempts":1}

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

以上是“Laravel事件系統怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新巴尔虎左旗| 宿迁市| 胶南市| 常山县| 绵竹市| 昭觉县| 武夷山市| 牙克石市| 景洪市| 乐业县| 平塘县| 射阳县| 化州市| 五华县| 桃江县| 东乡县| 神池县| 兰溪市| 凉城县| 凉山| 龙门县| 武冈市| 义乌市| 延吉市| 蕲春县| 凤城市| 桐庐县| 开鲁县| 射洪县| 左云县| 卫辉市| 澜沧| 荥阳市| 武清区| 玉门市| 璧山县| 丰镇市| 湖州市| 康定县| 叙永县| 石泉县|