# [thinkphp6事件監聽event-listene](https://www.cnblogs.com/wqy415/p/16148492.html)
事件系統可以看成是行為系統的升級版,相比行為系統強大的地方在于事件本身可以是一個類,并且可以更好的支持事件訂閱者。
事件相比較中間件的優勢是事件比中間件更加精準定位(或者說粒度更細),并且更適合一些業務場景的擴展。例如,我們通常會遇到用戶注冊或者登錄后需要做一系列操作,通過事件系統可以做到不侵入原有代碼完成登錄的操作擴展,降低系統的耦合性的同時,也降低了BUG的可能性。
步驟一:準備登錄入口
?
首先準備一個登錄入口 ,該入口本地的虛擬路由為 /api/login
```
`class``User``extends``BaseController`
`{`
`public``function``login()`
`{`
`//執行登錄操作`
`echo``"login_entrance\n"``;`
`$user``= \app\common\model\User::find(1)->toArray();`
`//登錄成功后的操作,比如可以分配邀請獎勵,寫入登錄日志等`
`echo``"login_after\n"``;`
`}`
`}`
```
步驟二:創建事件
創建UserLoginAfterEvent事件,并在config/event.php配置文件中進行綁定
```
`class``UserLoginAfterEvent`
`{`
`public``$user``;`
`public``function``__construct(``$user``)`
`{`
`$this``->user =``$user``;`
`echo``"user_login_after_event\n"``;`
`}`
`}`
```
```
`'bind'`?????`=> [`
`'UserLoginAfter'``=> \app\common\event\UserLoginAfterEvent::``class`
`],`
```
然后在user/login 方法后面增加觸發事件代碼
```
`public``function``login()`
`{`
`//執行登錄操作`
`echo``"login_entrance\n"``;`
`$user``= \app\common\model\User::find(1)->toArray();`
`//登錄成功后的操作,比如可以分配邀請獎勵,寫入登錄日志等`
`echo``"login_after\n"``;`
`/** 觸發事件 */`
`// 通過事件標識`
`event(``"UserLoginAfter"``,``$user``);`
`// 傳入事件對象實例`
`event(``new``UserLoginAfterEvent(``$user``));`
`}`
```
這時執行 /api/login 的輸出結果如下:
```
`login_entrance`
`login_after`
`user_login_after_event`
```
經過驗證 此時 使用事件標識觸發 在UserLoginAfterEvent事件中 沒有結果輸出的。
步驟三:創建監聽
創建事件監聽類?UserLoginAfterListener.php,并在config/event.php配置文件中進行綁定
```
`class``UserLoginAfterListener`
`{`
`public``function``handle(``$user``)`
`{`
`// 事件監聽處理`
`echo``"user_login_after_listener\n"``;`
`}`
`}`
```
```
`'listen'`???`=> [`
`'UserLoginAfter'``=> [\app\common\listener\UserLoginAfterListener::``class``]`
`],`
```
這時執行 /api/login 的輸出結果如下:
```
`login_entrance`
`login_after`
`user_login_after_listener`
`user_login_after_event`
`user_login_after_listener`
```
另外在?UserLoginAfterListener 中打印 $user?的結果如下:
```
`^``array``:3 [?``"id"``=> 1?``"username"``=>``"wangqy"`?`"password"``=>``"123456"``]`
`^ app\common\event\UserLoginAfterEvent {#88? +user:``array``:3 [???``"id"``=> 1???``"username"``=>``"wangqy"`???`"password"``=>``"123456"`?`]}`
```
結論
通過上述測試得出的結果如下:
1、使用事件標識來監聽時 是不走定義的事件類的,只有在event方法中傳入事件實例才能夠在事件類進行操作值。
2、通過事件標識來監聽時 ,在監聽類中接受的值,是實際在觸發事件時傳入的參數,而通過事件類實例監聽時,在監聽類中拿到的是事件類實例。
注意:
在進行監聽類綁定時,要注意標識后面的值是數組類型,使用下面這種方式,雖然沒有報錯,但是也不會生效。
```
`'UserLoginAfter'``=>?\app\common\listener\UserLoginAfterListener::``class`
```
- thinkphp6執行流程(一)
- php中use關鍵字用法詳解
- Thinkphp6使用騰訊云發送短信步驟
- 路由配置
- Thinkphp6,static靜態資源訪問路徑問題
- ThinkPHP6.0+ 使用Redis 原始用法
- smarty在thinkphp6.0中的最佳實踐
- Thinkphp6.0 搜索器使用方法
- 從已有安裝包(vendor)恢復 composer.json
- tp6with的用法,表間關聯查詢
- thinkphp6.x多對多如何添加中間表限制條件
- thinkphp6 安裝JWT
- 緩存類型
- 請求信息和HTTP頭信息
- 模型事件用法
- 助手函數匯總
- tp6集成Alipay 手機和電腦端支付的方法
- thinkphp6使用jwt
- 6.0session cookie cache
- tp6筆記
- TP6(thinkphp6)隊列與延時隊列
- thinkphp6 command(自定義指令)
- command(自定義指令)
- 本地文件上傳
- 緩存
- 響應
- 公共函數配置
- 七牛云+文件上傳
- thinkphp6:訪問多個redis數據源(thinkphp6.0.5 / php 7.4.9)
- 富文本編輯器wangEditor3
- IP黑名單
- 增刪改查 +文件上傳
- workerman 定時器操作控制器的方法
- 上傳文件到阿里云oss
- 短信或者郵箱驗證碼防刷代碼
- thinkphp6:訪問redis6(thinkphp 6.0.9/php 8.0.14)
- 實現關聯多個id以逗號分開查詢數據
- thinkphp6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 用mpdf生成pdf文件(php 8.1.1 / thinkphp v6.0.10LTS )
- 生成帶logo的二維碼(php 8.1.1 / thinkphp v6.0.10LTS )
- mysql數據庫使用事務(php 8.1.1 / thinkphp v6.0.10LTS)
- 一,創建過濾IP的中間件
- 源碼解析請求流程
- 驗證碼生成
- 權限管理
- 自定義異常類
- 事件監聽event-listene
- 安裝與使用think-addons
- 事件與多應用
- Workerman 基本使用
- 查詢用戶列表按拼音字母排序
- 擴展包合集
- 查詢用戶數據,但是可以通過輸入用戶昵稱來搜索用戶同時還要統計用戶的文章和粉絲數
- 根據圖片的minetype類型獲取文件真實拓展名思路
- 到處excel
- 用imagemagick庫生成縮略圖
- 生成zip壓縮包并下載
- API 多版本控制
- 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- 【thinkphp6源碼分析三】 APP類之父, 容器Container類
- thinkphp6表單重復提交解決辦法
- 小程序授權
- 最簡單的thinkphp6導出Excel
- 根據訪問設備不同訪問不同模塊
- 服務系統
- 前置/后置中間件
- 給接口api做簽名驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- 6實現郵箱注冊功能的細節和代碼(點擊鏈接激活方式)
- 使用前后端分離的驗證碼(thinkphp 6.0.9/php 8.0.14/vue 3.2.26)
- 前后端分離:用jwt+middleware做用戶登錄驗證(php 8.1.1 / thinkphp v6.0.10LTS )
- vue前后端分離多圖上傳
- thinkphp 分組、頁面跳轉與ajax
- thinkphp6 常用方法文檔
- 手冊里沒有的一些用法
- Swagger 3 API 注釋
- PHP 秒級定時任務
- thinkphp6集成gatewayWorker(workerman)實現實時監聽
- thinkphp6按月新增數據表
- 使用redis 實現消息隊列
- api接口 統一結果返回處理類
- 使用swoole+thinkphp6.0+redis 結合開發的登錄模塊
- 給接口api做簽名驗證
- ThinkPHP6.0 + UniApp 實現小程序的 微信登錄
- ThinkPHP6.0 + Vue + ElementUI + axios 的環境安裝到實現 CURD 操作!
- 異常$e
- 參數請求驗證自定義和異常錯誤自定義