這篇文章主要介紹Laravel事件系統(tǒng)怎么用,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
為孟連等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及孟連網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、孟連網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
Laravel 事件系統(tǒng)用法總結(jié)
Laravel 的事件提供了一個簡單的觀察者實(shí)現(xiàn),能夠訂閱和監(jiān)聽?wèi)?yīng)用中發(fā)生的各種事件。事件類保存在 app/Events 目錄中,而這些事件的的監(jiān)聽器則被保存在 app/Listeners 目錄下。這些目錄只有當(dāng)你使用 Artisan 命令來生成事件和監(jiān)聽器時才會被自動創(chuàng)建。
事件機(jī)制是一種很好的應(yīng)用解耦方式,因為一個事件可以擁有多個互不依賴的監(jiān)聽器。例如,如果你希望每次訂單發(fā)貨時向用戶發(fā)送一個 Slack 通知。你可以簡單地發(fā)起一個 OrderShipped 事件,讓監(jiān)聽器接收之后轉(zhuǎn)化成一個 Slack 通知,這樣你就可以不用把訂單的業(yè)務(wù)代碼跟 Slack 通知的代碼耦合在一起了。
生成一個事件類
比如通過 artisan 命令生成一個 UserLogin 事件:
php artisan make:event UserLogin
在 app/Events 中就會自動生成一個 UserLogin.php 文件,內(nèi)容不多,如下:
<?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'); } }
定義監(jiān)聽器
一個事件可以被一個或多個監(jiān)聽器監(jiān)聽,也就是觀察者模式,我們可以定義多個監(jiān)聽器,當(dāng)這個事件發(fā)生,執(zhí)行一系列邏輯。
在 EventServiceProvider 的 $listen 中可以定義事件和監(jiān)聽器,如下:
protected $listen = [ 'App\Events\UserLogin' => [ 'App\Listeners\DoSomething1', 'App\Listeners\Dosomething2', ], ];
然后執(zhí)行 artisan 命令,就可以自動在 app/Listeners 目錄生成監(jiān)聽器。
php artisan event:generate
可以看到 app/Listeners 目錄多了 DoSomething1.php 和 DoSomething2.php 兩個文件,我們看看其中一個內(nèi)容:
<?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'); } }
在兩個監(jiān)聽器的 handle 方法中我們打印一個日志來測試一下,如代碼 handle 方法所示。
分發(fā)和觸發(fā)事件
我們在某個控制器的方法中來分發(fā)事件,也就是觸發(fā)事件,看監(jiān)聽器是否正常工作。
就是一句話:
event(new UserLogin());
然后我們請求這個控制器,觀察日志,發(fā)現(xiàn)打印了日志:
[2018-06-17 10:04:29] local.INFO: do something1 [2018-06-17 10:04:29] local.INFO: do something2
那么這個事件-監(jiān)聽機(jī)制就正常工作了。
隊列異步處理
如果某個監(jiān)聽器需要執(zhí)行的操作比較慢,可以放到消息隊列進(jìn)行異步處理。
比如把上面的 DoSomething1 改成需要放入隊列的,只需要 implements ShoulQueue 接口。
class DoSomething1 implements ShouldQueue
也可以指定隊列驅(qū)動,如下代碼。
/** * 任務(wù)應(yīng)該發(fā)送到的隊列的連接的名稱 * * @var string|null */ public $connection = 'redis'; /** * 任務(wù)應(yīng)該發(fā)送到的隊列的名稱 * * @var string|null */ public $queue = 'listeners';
我們再次執(zhí)行控制器方法。
日志里沒有打印 do something1,只有 do something2,但是在 redis 隊列里發(fā)現(xiàn)了一個名為 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 執(zhí)行隊列任務(wù),才是真正執(zhí)行 DoSomething1 這個監(jiān)聽器的 handle 方法。
以上是“Laravel事件系統(tǒng)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享題目:Laravel事件系統(tǒng)怎么用
網(wǎng)頁路徑:http://www.muchs.cn/article26/ghgecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、微信小程序、營銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、Google、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)