摘要:下面就事件事件監(jiān)聽舉一個很簡單的例子你就會發(fā)現(xiàn)。定義監(jiān)聽器事件監(jiān)聽器在方法中接收事件實例,命令將會自動在方法中導(dǎo)入合適的事件類和類型提示事件。
? 有時候當我們單純的看 Laravel 手冊的時候會有一些疑惑,比如說系統(tǒng)服務(wù)下的授權(quán)和事件,這些功能服務(wù)的應(yīng)用場景是什么,其實如果沒有經(jīng)歷過一定的開發(fā)經(jīng)驗有這些疑惑是很正常的事情,但是當我們在工作中多加思考會發(fā)現(xiàn)有時候這些服務(wù)其實我們一直都見過。下面就事件、事件監(jiān)聽舉一個很簡單的例子你就會發(fā)現(xiàn)。
? 這個例子是關(guān)于文章的瀏覽數(shù)的實現(xiàn),當用戶查看文章的時候文章的瀏覽數(shù)會增加1,用戶查看文章就是一個事件,有了事件,就需要一個事件監(jiān)聽器,對監(jiān)聽的事件發(fā)生后執(zhí)行相應(yīng)的操作(文章瀏覽數(shù)加1),其實這種監(jiān)聽機制在 Laravel 中是通過觀察者模式實現(xiàn)的.
注冊事件以及監(jiān)聽器首先我們需要在 app/Providers/目錄下的EventServiceProvider.php中注冊事件監(jiān)聽器映射關(guān)系,如下:
protected $listen = [ "AppEventsBlogView" => [ "AppListenersBlogViewListener", ], ];
然后項目根目錄下執(zhí)行如下命令
php artisan event:generate
該命令完成后,會分別自動在 app/Events和app/Listensers目錄下生成 BlogView.php和BlogViewListener.php文件。
定義事件post = $post; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return []; } }
其實看到這些你會發(fā)現(xiàn)該事件類只是注入了一個 Post實例罷了,并沒有包含多余的邏輯。
定義監(jiān)聽器事件監(jiān)聽器在handle方法中接收事件實例,event:generate命令將會自動在handle方法中導(dǎo)入合適的事件類和類型提示事件。在handle方法內(nèi),你可以執(zhí)行任何需要的邏輯以響應(yīng)事件,我們的代碼實現(xiàn)如下:
session = $session; } /** * Handle the event. * * @param BlogView $event * @return void */ public function handle(BlogView $event) { $post = $event->post; //先進行判斷是否已經(jīng)查看過 if (!$this->hasViewedBlog($post)) { //保存到數(shù)據(jù)庫 $post->view_cache = $post->view_cache + 1; $post->save(); //看過之后將保存到 Session $this->storeViewedBlog($post); } } protected function hasViewedBlog($post) { return array_key_exists($post->id, $this->getViewedBlogs()); } protected function getViewedBlogs() { return $this->session->get("viewed_Blogs", []); } protected function storeViewedBlog($post) { $key = "viewed_Blogs.".$post->id; $this->session->put($key, time()); } }
注釋中也已經(jīng)說明了一些邏輯。
觸發(fā)事件事件和事件監(jiān)聽完成后,我們要做的就是實現(xiàn)整個監(jiān)聽,即觸發(fā)用戶打開文章事件在此我們使用和 Event提供的 fire方法,如下:
firstOrFail(); Event::fire(new BlogView($post)); return view("home.blog.content")->withPost($post); } }
現(xiàn)在打開頁面發(fā)現(xiàn)數(shù)據(jù)庫中的 view_cache 已經(jīng)正常加1了,這樣整個就完成了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21232.html
摘要:事實上,這是討論測試的惟一一章。因此,在中沒有單一的測試方法。包含了這是的標準強調(diào)業(yè)務(wù)或特性測試是最流行的框架。然后我們在這個項目中使用進行單元測試。在隨后的章節(jié)中,將不再進行測試。 原文地址: Laravel 5.1 Beauty - Testing Note 本系列第四節(jié)內(nèi)容. 本章會創(chuàng)建一個以后可以用到的項目便于以后我們的課程使用, 同時也會查課各種測試選項. 以后一段時間內(nèi)會開...
摘要:初步嘗試既然最常見的注冊命令的方式是修改類中的,那么一般正常人都會從這邊開始下手。又要自己取出實例,又要自己調(diào)用方法,調(diào)用方法之前還有自己先把實例化這么繁瑣,肯定不是運行時添加命令的最佳實踐,所以我決定繼續(xù)尋找更優(yōu)解。 本文首發(fā)于我的博客,原文鏈接:https://blessing.studio/best-... 雖然 Laravel 官方文檔提供的添加 Artisan Command...
摘要:提供了一種全新的發(fā)送通知的方式。個人理解是可以基于某事件操作觸發(fā)一系列的通知任務(wù),而通知方式由通知渠道接管,這樣使得通知或推送邏輯更抽象,更易于管理和重構(gòu)。在之前,我是利用的來完成這一系列通知。使用的配置文件還是原來的,無需重新配置。 Laravel Notification Laravel 5.3 提供了一種全新的發(fā)送通知的方式:Notification 。個人理解是可以基于某事件(...
摘要:框架關(guān)鍵技術(shù)解析讀書筆記二第五章框架應(yīng)用程序根目錄版本默認的框架應(yīng)用程序是符合規(guī)范的,所以相應(yīng)的目錄結(jié)構(gòu)也是基本固定的,不同的目錄加載了功能文件,如果添加了新的目錄,需要在文件中添加規(guī)范的自動加載部分并執(zhí)行命令。 Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(二) 第五章 框架應(yīng)用程序根目錄(5.1版本) 默認的Laravel框架應(yīng)用程序是符合PSR規(guī)范的,所以相應(yīng)的目錄結(jié)構(gòu)也是基本...
摘要:對于包含通配符的事件名,會被統(tǒng)一放入數(shù)組中,是用來創(chuàng)建事件對應(yīng)的的如果是監(jiān)聽器是類,去創(chuàng)建監(jiān)聽類創(chuàng)建的時候,會判斷監(jiān)聽對象是監(jiān)聽類還是閉包函數(shù)。對于閉包監(jiān)聽來說,會再包裝一層返回一個閉包函數(shù)作為事件的監(jiān)聽者。 事件系統(tǒng) Laravel 的事件提供了一個簡單的觀察者實現(xiàn),能夠訂閱和監(jiān)聽應(yīng)用中發(fā)生的各種事件。事件機制是一種很好的應(yīng)用解耦方式,因為一個事件可以擁有多個互不依賴的監(jiān)聽器。lar...
閱讀 2049·2023-04-25 15:24
閱讀 1586·2019-08-30 12:55
閱讀 1625·2019-08-29 15:27
閱讀 478·2019-08-26 17:04
閱讀 2416·2019-08-26 10:59
閱讀 1811·2019-08-26 10:44
閱讀 2207·2019-08-22 16:15
閱讀 2597·2019-08-22 15:36