最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

laravel 事件/監(jiān)聽(tīng)器實(shí)例代碼

 更新時(shí)間:2019年04月12日 10:28:25   作者:haoyq  
這篇文章主要介紹了laravel 事件/監(jiān)聽(tīng)器實(shí)例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

導(dǎo)語(yǔ)

上一篇文章實(shí)現(xiàn)了記錄用戶訪問(wèn),設(shè)計(jì)上是有缺陷的,代碼緊耦合在中間件。如果后續(xù)修改需求,不僅記錄 ip、城市,還需要記錄數(shù)據(jù)到新的數(shù)據(jù)表,或者需要進(jìn)行其它統(tǒng)計(jì),那么不停的增加、修改代碼是不合理的。這個(gè)時(shí)候可以使用 Laravel 的事件/監(jiān)聽(tīng)器進(jìn)行處理。代碼可查看 GitHub

事件/監(jiān)聽(tīng)器

Laravel 事件提供了簡(jiǎn)單的觀察者模式實(shí)現(xiàn),允許你訂閱和監(jiān)聽(tīng)?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)聽(tīng)器、觀察者模式的簡(jiǎn)要說(shuō)明。結(jié)合這次的需求理解,當(dāng)觸發(fā)用戶訪問(wèn)事件,它的觀察者進(jìn)行處理。觀察者可以是多個(gè),本例僅做入庫(kù)操作。

創(chuàng)建事件/監(jiān)聽(tīng)器

在 app/Providers/EventServiceProvider.php 文件中添加事件/監(jiān)聽(tīng)器,如下

 /**
   * The event listener mappings for the application.
   *
   * @var array
   */
  protected $listen = [
    Registered::class => [
      SendEmailVerificationNotification::class,
    ],
    'App\Events\UserBrowse' => [
      'App\Listeners\CreateBrowseLog',
      // 其它監(jiān)聽(tīng)器
    ],
  ];

添加好之后,執(zhí)行 php artisan event:generate,會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的事件/監(jiān)聽(tīng)器。分別創(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)聽(tīng)器 app/Listeners/CreateBrowseLog.php,這里要做的是,將事件中接收到的數(shù)據(jù)進(jìn)行入庫(kù)操作,代碼如下

/**
   * Handle the event.
   *
   * @param UserBrowse $event
   * @return void
   */
  public function handle(UserBrowse $event)
  {
    $log = new \App\Models\BrowseLog();

    $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 \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
  public function handle($request, Closure $next)
  {
    // 使用事件/監(jiān)聽(tīng)器入庫(kù)
    event(new UserBrowse($request->getClientIp(), $request->path(), get_city_by_ip(false, 'null')));
    
    return $next($request);
  }

測(cè)試之后是沒(méi)有問(wèn)題的。

結(jié)語(yǔ)

這次所做的修改,感官上來(lái)看,就是將入庫(kù)操作從中間件轉(zhuǎn)移到監(jiān)聽(tīng)器中,實(shí)際上的意義遠(yuǎn)不止于此。例如同一個(gè)事件,可以分發(fā)在不同的地方;事件添加了需求,只需要在添加一個(gè)監(jiān)聽(tīng)器即可;監(jiān)聽(tīng)器中也可以使用隊(duì)列等等。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 實(shí)例分析10個(gè)PHP常見(jiàn)安全問(wèn)題

    實(shí)例分析10個(gè)PHP常見(jiàn)安全問(wèn)題

    在本篇文章里小編給各位分享了關(guān)于10個(gè)PHP常見(jiàn)安全問(wèn)題以及相關(guān)實(shí)例代碼,需要的朋友們學(xué)習(xí)參考下。
    2019-07-07
  • 微信公眾號(hào)開(kāi)發(fā)之獲取位置信息php代碼

    微信公眾號(hào)開(kāi)發(fā)之獲取位置信息php代碼

    這篇文章主要為大家詳細(xì)介紹了微信公眾號(hào)開(kāi)發(fā)之獲取位置信息php代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Laravel 數(shù)據(jù)庫(kù)加密及數(shù)據(jù)庫(kù)表前綴配置方法

    Laravel 數(shù)據(jù)庫(kù)加密及數(shù)據(jù)庫(kù)表前綴配置方法

    今天小編就為大家分享一篇Laravel 數(shù)據(jù)庫(kù)加密及數(shù)據(jù)庫(kù)表前綴配置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • CakePHP框架Model函數(shù)定義方法示例

    CakePHP框架Model函數(shù)定義方法示例

    這篇文章主要介紹了CakePHP框架Model函數(shù)定義方法,結(jié)合具體查詢函數(shù)示例分析了CakePHP框架Model函數(shù)的定義方法,需要的朋友可以參考下
    2017-08-08
  • php顯示頁(yè)碼分頁(yè)類的封裝

    php顯示頁(yè)碼分頁(yè)類的封裝

    這篇文章主要為大家詳細(xì)介紹了php封裝一個(gè)顯示頁(yè)碼的分頁(yè)類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • ThinkPHP3.1新特性之查詢條件預(yù)處理簡(jiǎn)介

    ThinkPHP3.1新特性之查詢條件預(yù)處理簡(jiǎn)介

    相比于ThinkPHP3.0版本對(duì)數(shù)組方式的查詢條件會(huì)進(jìn)行安全過(guò)濾而不支持字符串條件的安全過(guò)濾的情況,ThinkPHP3.1版本則增加了對(duì)條件字符串進(jìn)行預(yù)處理的支持,讓ORM的安全性更加得以保證。這篇文章主要介紹了ThinkPHP3.1的查詢條件預(yù)處理,需要的朋友可以參考下
    2014-06-06
  • PHP實(shí)現(xiàn)文件上傳后臺(tái)處理腳本

    PHP實(shí)現(xiàn)文件上傳后臺(tái)處理腳本

    這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)文件上傳后臺(tái)處理腳本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • PHP微信支付開(kāi)發(fā)實(shí)例

    PHP微信支付開(kāi)發(fā)實(shí)例

    這篇文章主要為大家詳細(xì)介紹了PHP微信支付開(kāi)發(fā)過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 基于php驗(yàn)證碼函數(shù)的使用示例

    基于php驗(yàn)證碼函數(shù)的使用示例

    本篇文章關(guān)于php驗(yàn)證碼函數(shù)的應(yīng)用,用示例說(shuō)明。需要的朋友參考下
    2013-05-05
  • ThinkPHP3.1新特性之內(nèi)容解析輸出詳解

    ThinkPHP3.1新特性之內(nèi)容解析輸出詳解

    以往版本的ThinkPHP對(duì)于模板文件保存在數(shù)據(jù)庫(kù)里面的情況下,無(wú)法進(jìn)行模板文件讀取的。這篇文章主要介紹了ThinkPHP3.1新特性的內(nèi)容解析輸出,需要的朋友可以參考下
    2014-06-06

最新評(píng)論

汶上县| 岱山县| 特克斯县| 社旗县| 乡城县| 三台县| 特克斯县| 阳朔县| 赤城县| 佳木斯市| 赤壁市| 东方市| 安丘市| 重庆市| 玉门市| 天柱县| 甘肃省| 兴仁县| 唐山市| 盐源县| 昭平县| 黔东| 新泰市| 新民市| 福海县| 石景山区| 景洪市| 广灵县| 阳春市| 绥芬河市| 望江县| 休宁县| 眉山市| 玛纳斯县| 陆川县| 兴义市| 彭山县| 得荣县| 天全县| 调兵山市| 盐城市|