摘要:事件監聽器事件提供了簡單的觀察者模式實現,允許你訂閱和監聽應用中的事件。以上是事件監聽器觀察者模式的簡要說明。
導語
上一篇文章實現了記錄用戶訪問,設計上是有缺陷的,代碼緊耦合在中間件。如果后續修改需求,不僅記錄 ip、城市,還需要記錄數據到新的數據表,或者需要進行其它統計,那么不停的增加、修改代碼是不合理的。這個時候可以使用 Laravel 的事件/監聽器進行處理。代碼可查看 GitHub。
事件/監聽器Laravel 事件提供了簡單的觀察者模式實現,允許你訂閱和監聽應用中的事件。觀察者模式有時也被稱作發布/訂閱模式,該模式用于為對象實現發布/訂閱功能:一旦主體對象狀態發生改變,與之關聯的觀察者對象會收到通知,并進行相應操作。
以上是事件/監聽器、觀察者模式的簡要說明。結合這次的需求理解,當觸發用戶訪問事件,它的觀察者進行處理。觀察者可以是多個,本例僅做入庫操作。
創建事件/監聽器在 app/Providers/EventServiceProvider.php 文件中添加事件/監聽器,如下
/** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], "AppEventsUserBrowse" => [ "AppListenersCreateBrowseLog", // 其它監聽器 ], ];
添加好之后,執行 php artisan event:generate,會自動創建對應的事件/監聽器。分別創建了 app/Events/UserBrowse.php 和 app/Listeners/CreateBrowseLog.php 兩個文件。
實現代碼把目光聚集到事件 app/Events/UserBrowse.php 文件,這里需要接收數據以便后續處理,代碼如下
public $ip_addr; public $request_url; public $city_name; /** * Create a new event instance. * * @return void */ public function __construct($ip_addr, $request_url, $city_name) { $this->ip_addr = $ip_addr; $this->request_url = $request_url; $this->city_name = $city_name; }
然后是監聽器 app/Listeners/CreateBrowseLog.php,這里要做的是,將事件中接收到的數據進行入庫操作,代碼如下
/** * Handle the event. * * @param UserBrowse $event * @return void */ public function handle(UserBrowse $event) { $log = new AppModelsBrowseLog(); $log->ip_addr = $event->ip_addr; $log->request_url = $event->request_url; $log->city_name = $event->city_name; $log->save(); }分發事件
最后就是分發事件,修改 app/Http/Middleware/BrowseLog.php 中間件的代碼,修改后如下
/** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { // 使用事件/監聽器入庫 event(new UserBrowse($request->getClientIp(), $request->path(), get_city_by_ip(false, "null"))); return $next($request); }
測試之后是沒有問題的。
結語這次所做的修改,感官上來看,就是將入庫操作從中間件轉移到監聽器中,實際上的意義遠不止于此。例如同一個事件,可以分發在不同的地方;事件添加了需求,只需要在添加一個監聽器即可;監聽器中也可以使用隊列等等。
參考資料:事件、觀察者模式 。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31181.html
摘要:模型事件在的世界中你對大多數操作都會或多或少的觸發一些模型事件今天就來看一下模型事件的使用。事先已經定義好了個模型事件以供我們使用它們分別是。和會在數據庫中的真值修改前后觸發。監聽數據即將保存的事件。監聽數據從軟刪除狀態恢復后的事件。 模型事件 在 Laravel 的世界中,你對 Eloquent 大多數操作都會或多或少的觸發一些模型事件,今天就來看一下模型事件的使用。 Laravel...
摘要:說明本文主要講述使用作為緩存加快頁面訪問速度。何不用來做緩存,等到該達到一定瀏覽頁面后再刷新下,效率也很高。可作緩存系統隊列系統。 說明:本文主要講述使用Redis作為緩存加快頁面訪問速度。同時,作者會將開發過程中的一些截圖和代碼黏上去,提高閱讀效率。 備注:作者最近在學習github上別人的源碼時,發現好多在計算一篇博客頁面訪問量view_count時都是這么做的:利用Laravel...
摘要:事件驅動編程是圖形用戶界面和其他應用程序例如應用程序中使用的主要范例,用于執行某些操作來響應用戶輸入。我們來看一下事件驅動編程帶來的收益。現在讓我們看看采用事件驅動編程方法如何實現上述相同的功能。 在這篇文章中我們將了解到什么是事件驅動編程以及在Laravel中如何開始構建一個事件驅動應用,同時我們還將看到如何通過事件驅動編程來對應用程序的邏輯進行解耦。 在開始之前,先說明一下這篇文章...
摘要:一旦這一切完成,方法會運行在類屬性在命令構造后設置容器解析實例,在中我們設置了將使用的緩存驅動,我們也根據命令來決定我們調用什么方法。作業只在以上起效在上也無效處理作業方法調用觸發事件觸發事件。 譯文GitHub https://github.com/yuansir/diving-laravel-zh 原文鏈接https://divinglaravel.com/queue-system...
閱讀 2158·2021-09-22 10:56
閱讀 1465·2021-09-07 10:11
閱讀 1801·2019-08-30 15:54
閱讀 2290·2019-08-30 15:44
閱讀 2307·2019-08-29 12:40
閱讀 3031·2019-08-28 18:25
閱讀 1735·2019-08-26 10:24
閱讀 3186·2019-08-23 18:39