laravel事件監聽使用大概分為以下步驟:
① 註冊事件和事件監聽器
② 生成事件檔案和事件監聽器檔案
③ 定義事件
④ 定義事件監聽器
⑤ 分發事件(呼叫事件)
一般基礎的事件操作就是分為上面5個步驟,在5.5中文手冊上面也有詳細說明,但是可能對一些剛接觸事件的新手來說可能有些地方不太容易理解甚至會有點疑惑,比如說我我就是這樣的菜鳥.所以記錄下自己一個小小的理解,希望對其他人有幫助
在我們使用事件之前,首先應該先去 app/Providers/目錄下開啟EventServiceProvider.php檔案之後我們會看到下圖的一個陣列
陣列 $listen 是用來註冊我們的事件和事件監聽器的一個陣列,其中陣列的鍵為我們需要定義的事件,值對應的為我們需要定義的事件監聽器,
比如我這裡,需要註冊的
事件為:Login 指定路徑為 App\Events\Login (處理登入的一個事件)
事件監聽器為:LoginListener 指定路徑為 App\Listeners\LoginListener(監聽登入事件的監聽器)
我們需要把指定路徑對應上圖,增加到陣列中,
此時我們已經註冊好了事件和監聽器
事件檔案存放在 app/Events 目錄下 監聽器 存放在 app/Listeners 目錄下 此時我們雖然定義好了監聽器,但是對應檔案並不存在,我們需要使用 laravel 的 artisan 命令 來在指定目錄下生成 事件檔案 Login 和 事件監聽 LoginListener 檔案php artisan event:generate
. 檔案生成之後,下面開始定義事件
開啟 app/Events 目錄下的 Login.php 事件檔案,如下圖有個結構函式
當我們在呼叫事件的時候我們有時候需要,給事件傳遞引數,這個引數可能是個 ORM 模型 也可能是個資料集 或者是個字串,此時如果我們希望事件能夠接收到我們傳遞的引數,就需要在 construct() 結構函式中來 定義接收,有兩種方法:
第一種
我們使用依賴注入的方式定義接收的引數(文件中便是此方法),假如我們接收的引數為Eloquent ORM 物件 User 則我們需要在事件中 引入 User 模型,然後在 construct()指定依賴 如下圖:
在定義完接收物件之後,還需要定義一個 pubic 屬性 然後將接收的引數賦值給這個public 屬性,以便於 事件監聽 程式呼叫 我們這裡定義為 public $eloquent 如下圖:
第二種
使用普通的引數接收方式,直接在construct()函式中指定一個引數用來接收呼叫事件傳遞的引數,這種就和我們正常函式傳參相同,同樣我們需要定義一個 公有屬性,將引數賦值給這個公有屬性,這裡仍然使用 public $eloquent
如下圖
以上我們,可以透過兩種方式來定義事件的接收
開啟 app/Listeners 目錄下的 LoginListener.php 事件檔案,在事件監聽檔案中有個handle函式用來處理我們的業務邏輯
如下圖:
根據業務需求,在handle中寫需求邏輯即可 $event 為之前事件 Login 依賴注入的物件,下面使用 dd($event)列印資料結構,這裡我們暫時還不能看到,在下面 說明事件分發(事件呼叫) 的時候會為大家展示 因為我們 定義事件 時有兩種方法
所以列印出來結果會不同
上面我們都定義好之後在我們業務需要的地方執行分發事件(呼叫事件) 使用 event(new 事件名(引數)) 來執行事件分發(事件呼叫)
注意: 如果我們定義事件的時候使用的是依賴注入的方式來傳遞引數,那麼我們在分發事件的時候 只能傳遞我們指定的依賴,否則會報錯,例如我們上面使用的 User $user 依賴 則在呼叫事件的時候 我們只能在我們的控制器中 傳遞 模型 User 的 ORM模型如下圖:
當我們登入成功呼叫事件的時候,就會列印出物件集如下圖
當我們使用第二種方法來定義事件的接收時,我們在呼叫事件時,傳遞的引數就會沒有限制了 我們可以根據需要傳遞不同的引數到事件中去,然後在事件監聽中 根據業務需求來獲取引數處理業務邏輯
比如當我使用第二種方式定義事件,我呼叫事件的時候傳遞一個陣列,和登入成功時,事件列印結果如下圖
執行事件
列印結果
以上便是兩種定義方式的,兩種事件呼叫方式
在事件監聽的handel()方法中透過 $event物件獲取引數 例如 列印結果 如下圖
則呼叫獲取陣列的方法為 $event->對應引數名 在這裡即為 $event->eloquent 如下圖
列印結果為:
以上便是個人隊event事件基礎使用的簡單一個總結,其中在使用依賴的方式時時本人踩得一個小坑所以記錄下來,
本人小白一枚剛學習laravel沒多久,有寫的不對的地方歡迎各位大神指點
本作品採用《CC 協議》,轉載必須註明作者和本文連結