亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    解析Laravel事件系統(tǒng)的使用方法

    下面由Laravel教程欄目帶大家介紹關(guān)于Laravel事件系統(tǒng)的使用方法,希望對(duì)大家有所幫助!

    Laravel 事件系統(tǒng)用法總結(jié)

    Laravel 的事件提供了一個(gè)簡單的觀察者實(shí)現(xiàn),能夠訂閱和監(jiān)聽?wèi)?yīng)用中發(fā)生的各種事件。事件類保存在 app/Events 目錄中,而這些事件的的監(jiān)聽器則被保存在 app/Listeners 目錄下。這些目錄只有當(dāng)你使用 Artisan 命令來生成事件和監(jiān)聽器時(shí)才會(huì)被自動(dòng)創(chuàng)建。

    事件機(jī)制是一種很好的應(yīng)用解耦方式,因?yàn)橐粋€(gè)事件可以擁有多個(gè)互不依賴的監(jiān)聽器。例如,如果你希望每次訂單發(fā)貨時(shí)向用戶發(fā)送一個(gè) Slack 通知。你可以簡單地發(fā)起一個(gè) OrderShipped 事件,讓監(jiān)聽器接收之后轉(zhuǎn)化成一個(gè) Slack 通知,這樣你就可以不用把訂單的業(yè)務(wù)代碼跟 Slack 通知的代碼耦合在一起了。

    生成一個(gè)事件類

    比如通過 artisan 命令生成一個(gè) UserLogin 事件:

    php artisan make:event UserLogin

    在 app/Events 中就會(huì)自動(dòng)生成一個(gè) UserLogin.php 文件,內(nèi)容不多,如下:

    <?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('channel-name');     } }

    定義監(jiān)聽器

    一個(gè)事件可以被一個(gè)或多個(gè)監(jiān)聽器監(jiān)聽,也就是觀察者模式,我們可以定義多個(gè)監(jiān)聽器,當(dāng)這個(gè)事件發(fā)生,執(zhí)行一系列邏輯。

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

    protected $listen = [     'AppEventsUserLogin' => [         'AppListenersDoSomething1',         'AppListenersDosomething2',     ], ];

    然后執(zhí)行 artisan 命令,就可以自動(dòng)在 app/Listeners 目錄生成監(jiān)聽器。

    php artisan event:generate

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

    <?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('do something1');     } }

    在兩個(gè)監(jiān)聽器的 handle 方法中我們打印一個(gè)日志來測(cè)試一下,如代碼 handle 方法所示。

    分發(fā)和觸發(fā)事件

    我們?cè)谀硞€(gè)控制器的方法中來分發(fā)事件,也就是觸發(fā)事件,看監(jiān)聽器是否正常工作。

    就是一句話:

    event(new UserLogin());

    然后我們請(qǐng)求這個(gè)控制器,觀察日志,發(fā)現(xiàn)打印了日志:

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

    那么這個(gè)事件-監(jiān)聽機(jī)制就正常工作了。

    隊(duì)列異步處理

    如果某個(gè)監(jiān)聽器需要執(zhí)行的操作比較慢,可以放到消息隊(duì)列進(jìn)行異步處理。

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

    class DoSomething1 implements ShouldQueue

    也可以指定隊(duì)列驅(qū)動(dòng),如下代碼。

    /**      * 任務(wù)應(yīng)該發(fā)送到的隊(duì)列的連接的名稱      *      * @var string|null      */     public $connection = 'redis';       /**      * 任務(wù)應(yīng)該發(fā)送到的隊(duì)列的名稱      *      * @var string|null      */     public $queue = 'listeners';

    我們?cè)俅螆?zhí)行控制器方法。

    日志里沒有打印 do something1,只有 do something2,但是在 redis 隊(duì)列里發(fā)現(xiàn)了一個(gè)名為 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}

    這個(gè)時(shí)候需要使用 php artisan queue:work 執(zhí)行隊(duì)列任務(wù),才是真正執(zhí)行 DoSomething1 這個(gè)監(jiān)聽器的 handle 方法。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)