国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

laravel 事件/監聽器實例代碼

2024-05-05 00:08:21
字體:
來源:轉載
供稿:網友

導語

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

事件/監聽器

Laravel 事件提供了簡單的觀察者模式實現,允許你訂閱和監聽應用中的事件。

觀察者模式有時也被稱作發布/訂閱模式,該模式用于為對象實現發布/訂閱功能:一旦主體對象狀態發生改變,與之關聯的觀察者對象會收到通知,并進行相應操作。

以上是事件/監聽器、觀察者模式的簡要說明。結合這次的需求理解,當觸發用戶訪問事件,它的觀察者進行處理。觀察者可以是多個,本例僅做入庫操作。

創建事件/監聽器

在 app/Providers/EventServiceProvider.php 文件中添加事件/監聽器,如下

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

添加好之后,執行 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 /App/Models/BrowseLog();    $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 /Illuminate/Http/Request $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);  }

測試之后是沒有問題的。

結語

這次所做的修改,感官上來看,就是將入庫操作從中間件轉移到監聽器中,實際上的意義遠不止于此。例如同一個事件,可以分發在不同的地方;事件添加了需求,只需要在添加一個監聽器即可;監聽器中也可以使用隊列等等。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 桐庐县| 若羌县| 惠安县| 石首市| 浪卡子县| 吴旗县| 合作市| 满洲里市| 景洪市| 益阳市| 策勒县| 东平县| 平南县| 来凤县| 临沂市| 哈密市| 息烽县| 尼木县| 湛江市| 明水县| 油尖旺区| 囊谦县| 曲靖市| 宜昌市| 红原县| 涿鹿县| 嫩江县| 唐山市| 灌南县| 仙居县| 颍上县| 宜兴市| 奉节县| 偃师市| 敖汉旗| 嘉义市| 和政县| 嘉义市| 乌兰县| 大埔县| 连州市|