Laravel event 事件的简单使用
有時候當我們單純的看 Laravel手冊的時候會有一些疑惑,比如說系統服務下的授權和事件,這些功能服務的應用場景是什么,其實如果沒有經歷過一定的開發經驗有這些疑惑是很正常的事情,但是當我們在工作中多加思考會發現有時候這些服務其實我們一直都見過。下面就事件、事件監聽舉一個很簡單的例子你就會發現。
?
這個例子是關于文章的瀏覽數的實現,當用戶查看文章的時候文章的瀏覽數會增加1,用戶查看文章就是一個事件,有了事件,就需要一個事件監聽器,對監聽的事件發生后執行相應的操作(文章瀏覽數加1),其實這種監聽機制在 Laravel 中是通過觀察者模式實現的.
鏈接
laravel 事件監聽使用大概分為以下步驟:
- ① 注冊事件和事件監聽器
- ② 生成事件文件和事件監聽器文件
- ③ 定義事件
- ④ 定義事件監聽器
- ⑤ 分發事件 (調用事件)
1. 注冊事件和事件監聽器
在我們使用事件之前,首先應該先去 app/Providers/ 目錄下打開 EventServiceProvider.php 文件之后我們會看到如下的一個數組
數組 $listen 是用來注冊我們的事件和事件監聽器的一個數組,其中數組的鍵為我們需要定義的事件,值對應的為我們需要定義的事件監聽器,
比如我這里,需要注冊的
事件為:ArticleEvent 指定路徑為 App\Events\ArticleEvent (處理文章點擊的一個事件)
事件監聽器為:ArticleEventListener 指定路徑為 App\Listeners\ArticleEventListener (監聽文章點擊事件的監聽器)
我們需要把指定路徑對應上圖,增加到數組中,
此時我們已經注冊好了事件和監聽器
2. 生成事件文件和事件監聽器文件
事件文件存放在 app/Events 目錄下 監聽器 存放在 app/Listeners 目錄下 此時我們雖然定義好了監聽器,但是對應文件并不存在,我們需要使用 laravel 的 artisan 命令 來在指定目錄下生成 事件文件 ArticleEvent 和 事件監聽 ArticleEventListener 文件
php artisan event:generate?文件生成之后,下面開始定義事件
3. 定義事件
打開 app/Events 目錄下的 ArticleEvent .php 事件文件,如下有個結構函數
當我們在調用事件的時候我們有時候需要,給事件傳遞參數,這個參數可能是個 ORM 模型 也可能是個數據集 或者是個字符串,此時如果我們希望事件能夠接收到我們傳遞的參數,就需要在 construct () 結構函數中來 定義接收,有兩種方法:
第一種
我們使用依賴注入的方式定義接收的參數 (文檔中便是此方法), 假如我們接收的參數為 Eloquent ORM 對象 Article 則我們需要在事件中 引入 Article模型,然后在 construct () 指定依賴,在定義完接收對象之后,還需要定義一個 pubic 屬性 然后將接收的參數賦值給這個 public 屬性,以便于 事件監聽 程序調用 我們這里定義為 public $article 如下:
第二種
使用普通的參數接收方式,直接在 construct () 函數中指定一個參數用來接收調用事件傳遞的參數,這種就和我們正常函數傳參相同,同樣我們需要定義一個 公有屬性,將參數賦值給這個公有屬性,這里仍然使用 public $article,如下
以上我們,可以通過兩種方式來定義事件的接收
4. 定義事件監聽器
打開 app/Listeners 目錄下的 ArticleEventListener.php 事件文件,在事件監聽文件中有個 handle 函數用來處理我們的業務邏輯
如下:
5. 分發事件 (調用事件)
上面我們都定義好之后在我們業務需要的地方執行分發事件 (調用事件) 使用 event (new 事件名 (參數)) 來執行事件分發 (事件調用)
注意:?如果我們定義事件的時候使用的是依賴注入的方式來傳遞參數,那么我們在分發事件的時候 只能傳遞我們指定的依賴,否則會報錯,例如我們上面使用的 Article $article 依賴 則在調用事件的時候 我們只能在我們的控制器中 傳遞 模型 Article的 ORM 模型如下:
當我們查看文章時,文章點擊數就會自動加1
當我們使用第二種方法來定義事件的接收時,我們在調用事件時,傳遞的參數就會沒有限制了 我們可以根據需要傳遞不同的參數到事件中去,然后在事件監聽中 根據業務需求來獲取參數處理業務邏輯
?
以上便是兩種定義方式的,兩種事件調用方式
總結
以上是生活随笔為你收集整理的Laravel event 事件的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从已有安装包(vendor)恢复 com
- 下一篇: MarkDown学习之Typora的使用