摘要:事件類保存在目錄中,而這些事件的的監(jiān)聽器則被保存在目錄下。這些目錄只有當(dāng)你使用命令來生成事件和監(jiān)聽器時(shí)才會(huì)被自動(dòng)創(chuàng)建。事件機(jī)制是一種很好的應(yīng)用解耦方式,因?yàn)橐粋€(gè)事件可以擁有多個(gè)互不依賴的監(jiān)聽器。參考鏈接事件系統(tǒng)隊(duì)列原文地址
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)容不多,如下:
定義監(jiān)聽器一個(gè)事件可以被一個(gè)或多個(gè)監(jiān)聽器監(jiān)聽,也就是觀察者模式,我們可以定義多個(gè)監(jiān)聽器,當(dāng)這個(gè)事件發(fā)生,執(zhí)行一系列邏輯。
在 EventServiceProvider 的 $listen 中可以定義事件和監(jiān)聽器,如下:
protected $listen = [ "AppEventsUserLogin" => [ "AppLisenterDoSomething1", "AppLisenterDosomething2", ], ];然后執(zhí)行 artisan 命令,就可以自動(dòng)在 app/Lisenter 目錄生成監(jiān)聽器。
php artisan make:event generate可以看到 app/Lisenter 目錄多了 DoSomething1.php 和 DoSomething2.php 兩個(gè)文件,我們看看其中一個(gè)內(nèi)容:
在兩個(gè)監(jiān)聽器的 handle 方法中我們打印一個(gè)日志來測試一下,如代碼 handle 方法所示。
分發(fā)和觸發(fā)事件我們在某個(gè)控制器的方法中來分發(fā)事件,也就是觸發(fā)事件,看監(jiān)聽器是否正常工作。
就是一句話:
event(new UserLogin());然后我們請求這個(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";我們再次執(zhí)行控制器方法。
日志里沒有打印 do something1,只有 do something2,但是在 redis 隊(duì)列里發(fā)現(xiàn)了一個(gè)名為 queues:default 的列表。
{"job":"IlluminateEventsCallQueuedHandler@call","data":{"class":"AppListenerDoSomething1","method":"handle","data":"a:1:{i:0;O:20:"AppEventsUserLogin":1:{s:6:"socket";N;}}"},"id":"3D7VDUwueYGtUvsazicWsifwWQxnnLID","attempts":1}這個(gè)時(shí)候需要使用 php artisan queue:work 執(zhí)行隊(duì)列任務(wù),才是真正執(zhí)行 DoSomething1 這個(gè)監(jiān)聽器的 handle 方法。
參考鏈接Laravel 5.5 事件系統(tǒng)(https://laravel-china.org/doc...
Laravel 隊(duì)列(https://laravel-china.org/doc...
(原文地址:https://blog.tanteng.me/2018/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28906.html
摘要:一簡單粗魯用于本地測試路由中定義測試一下修改事件二生成事件和監(jiān)聽器在定義對應(yīng)關(guān)系生成文件中注入要操作的類中方法注入對應(yīng)事件類測試一下修改事件最后在模型中添加屬性三利用框架的方法直接在相關(guān)中定義測試一下修改事件四定義如果想對多個(gè)模型的或事件進(jìn) 一 、簡單粗魯(用于本地測試) 路由中定義: Event::listen(eloquent.updated: AppPost,function ...
摘要:過去一年時(shí)間寫了多篇文章來探討了我認(rèn)為的框架最核心部分的設(shè)計(jì)思路代碼實(shí)現(xiàn)。為了大家閱讀方便,我把這些源碼學(xué)習(xí)的文章匯總到這里。數(shù)據(jù)庫算法和數(shù)據(jù)結(jié)構(gòu)這些都是編程的內(nèi)功,只有內(nèi)功深厚了才能解決遇到的復(fù)雜問題。 過去一年時(shí)間寫了20多篇文章來探討了我認(rèn)為的Larave框架最核心部分的設(shè)計(jì)思路、代碼實(shí)現(xiàn)。通過更新文章自己在軟件設(shè)計(jì)、文字表達(dá)方面都有所提高,在剛開始決定寫Laravel源碼分析地...
摘要:初步嘗試既然最常見的注冊命令的方式是修改類中的,那么一般正常人都會(huì)從這邊開始下手。又要自己取出實(shí)例,又要自己調(diào)用方法,調(diào)用方法之前還有自己先把實(shí)例化這么繁瑣,肯定不是運(yùn)行時(shí)添加命令的最佳實(shí)踐,所以我決定繼續(xù)尋找更優(yōu)解。 本文首發(fā)于我的博客,原文鏈接:https://blessing.studio/best-... 雖然 Laravel 官方文檔提供的添加 Artisan Command...
摘要:道阻且長啊前端面試總結(jié)前端面試筆試面試騰訊一面瀏覽器工作原理瀏覽器的主要組件包括用戶界面包括地址欄后退前進(jìn)按鈕書簽?zāi)夸洖g覽器引擎用來查詢及操作渲染引擎的接口渲染引擎渲染界面和是基于兩種渲染引擎構(gòu)建的,使用自主研發(fā)的渲染引擎,和都使用網(wǎng)絡(luò)用來 道阻且長啊TAT(前端面試總結(jié)) 前端 面試 筆試 面試 騰訊一面 1.瀏覽器工作原理 瀏覽器的主要組件包括: 用戶界面- 包括地址欄、后退/前...
摘要:道阻且長啊前端面試總結(jié)前端面試筆試面試騰訊一面瀏覽器工作原理瀏覽器的主要組件包括用戶界面包括地址欄后退前進(jìn)按鈕書簽?zāi)夸洖g覽器引擎用來查詢及操作渲染引擎的接口渲染引擎渲染界面和是基于兩種渲染引擎構(gòu)建的,使用自主研發(fā)的渲染引擎,和都使用網(wǎng)絡(luò)用來 道阻且長啊TAT(前端面試總結(jié)) 前端 面試 筆試 面試 騰訊一面 1.瀏覽器工作原理 瀏覽器的主要組件包括: 用戶界面- 包括地址欄、后退/前...
閱讀 2471·2019-08-30 15:53
閱讀 2584·2019-08-29 13:11
閱讀 2673·2019-08-29 12:45
閱讀 3498·2019-08-29 12:41
閱讀 2342·2019-08-26 10:14
閱讀 2171·2019-08-23 14:39
閱讀 2323·2019-08-23 12:38
閱讀 3388·2019-08-23 12:04