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