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