Laravel 5 事件綁定器
官方文件名稱為 Laravel Event
此篇文章主要是以實例的方式來描述在什麼樣的情況下會用到 Laravel Event.
舉例來說
想像我們現在有一個需求是要記錄使用者在登入登出時的 IP 及最後登入時間並寫入 logs
下列有幾種方法,在這篇文章中午會介紹各種用法:
- 在 中介層(Middleware) 時處理 — 在 route 時綁定 指定的 middleware.
- 在 事件(Event) 時處理 — 根據 Laravel 官方所提供的預設事件
- 在 控制器(Controller)時處理 — request
Laravel 5 官方提供的預設事件
事件參數artisan.start$applicationauth.attempt$credentials, $remember, $loginauth.login$user, $rememberauth.logout$usercache.missed$keycache.hit$key, $valuecache.write$key, $value, $minutescache.delete$keyconnection.{name}.beginTransaction$connectionconnection.{name}.committed$connectionconnection.{name}.rollingBack$connectionilluminate.query$query, $bindings, $time, $connectionNameilluminate.queue.after$connection, $job, $datailluminate.queue.failed$connection, $job, $datailluminate.queue.stoppingnullmailer.sending$messagerouter.matched$route, $requestcomposing:{view name}$viewcreating:{view name}$view
上圖為 Laravel 5 所提供的預設事件
在 中介層(Middleware) 時處理
在 Route 中我們加上登入時的路由
路由設定中介層
app/Http/routes.php
第 2 行使用 route group 將登入時須先過 login 這個中介層
註冊中介層
這個名稱需定義在app/Http/Kernel.php
第 29 行註冊我們自定義的 login middleware
實作中介層
接著我們就要來撰寫中介層的內容 middleware
app/Http/Middleware/InsertLogs.php
我們在 _construct 時注入我自定義的 repository interface
第 35~36 行為當使用者成功登入時我們填加一筆紀錄,其實這邊又有更多寫法
例如你可以先用 eloquent-relationships 去關聯 logs 並直接新增
在此就不多實作 insertMemberLoginLogs 方法
在 事件(Event) 時處理
第 1 步:註冊事件
註冊 Event listren 在 app/Event.php , 處理事件通常放在 app/Handlers/Events
app/Events/MemberLoginEvent.php
第 2 步:註冊事件監聽器
app/Providers/EventServiceProvider.php
第 17 行我們註冊監聽自定義的事件綁定到我們接下來會需要處理的 handler
注意:這邊的指定方法跟routes指定的方式一樣,意思是你可以使用 @ 去指定你想要的 handler class 中的方法(例如:EventServiceProvider@doSomethingMethod,EventServiceProvider class 中的 doSomethingMethod),若無指定預設使用 handle method。
若是使用 laravel 所提供的方法
註冊監聽可以改為(此方法的差異在於不用實作第一步:註冊事件 及 在第三步時已經有定義好的欄位 Laravel 5 所提供的預設事件):
第 3 步:實作事件
app/Handlers/Events/MemberLoginEventHandler.php
第 15 行為當 construct時注入自定義的 repository interface,第 28~29 行,為處理此事件的過程。
若是使用 laravel 所提供的事件方法
第 4 步:觸發事件
方法一:使用 event 觸發:
event(new MemberLoginEvent());
方法二:使用 Event facade 觸發:
Event::fire(new MemberLoginEvent());
以上兩種方法其實都是 call 同一個 function
通常會在 controller 實作,但若是使用 laravel 5 的預設使用者登入方法則可以不用觸發事件。
在此附上 Laravel 5 Event Source Code: https://github.com/Maras0830/laravel5-event-tutorial
在 控制器(Controller)時處理
這種方式是在確認使用者登入後於 controller 添加
app\Http\Controllers\AuthController.php