成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

laravel 事件/監(jiān)聽器 實(shí)例

Awbeci / 3669人閱讀

摘要:事件監(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.phpapp/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

相關(guān)文章

  • Laravel 中的模型事件與 Observer

    摘要:模型事件在的世界中你對(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...

    Yuanf 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記之Redis保存頁面瀏覽量

    摘要:說明本文主要講述使用作為緩存加快頁面訪問速度。何不用來做緩存,等到該達(dá)到一定瀏覽頁面后再刷新下,效率也很高??勺骶彺嫦到y(tǒng)隊(duì)列系統(tǒng)。 說明:本文主要講述使用Redis作為緩存加快頁面訪問速度。同時(shí),作者會(huì)將開發(fā)過程中的一些截圖和代碼黏上去,提高閱讀效率。 備注:作者最近在學(xué)習(xí)github上別人的源碼時(shí),發(fā)現(xiàn)好多在計(jì)算一篇博客頁面訪問量view_count時(shí)都是這么做的:利用Laravel...

    z2xy 評(píng)論0 收藏0
  • Laravel最佳實(shí)踐--事件驅(qū)動(dòng)編程

    摘要:事件驅(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)行解耦。 在開始之前,先說明一下這篇文章...

    Drummor 評(píng)論0 收藏0
  • 剖析Laravel隊(duì)列系統(tǒng)--Worker

    摘要:一旦這一切完成,方法會(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...

    CollinPeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<