当前位置:首页 > CMS教程 > 其它CMS > 列表

laravel 事件/监听器实例代码

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-17 10:40:22 浏览: 评论:0 

这篇文章主要介绍了laravel 事件/监听器实例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

导语:上一篇文章实现了记录用户访问,设计上是有缺陷的,代码紧耦合在中间件。如果后续修改需求,不仅记录 ip、城市,还需要记录数据到新的数据表,或者需要进行其它统计,那么不停的增加、修改代码是不合理的。这个时候可以使用 Laravel 的事件/监听器进行处理。代码可查看 GitHub。

事件/监听器

Laravel 事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。

观察者模式有时也被称作发布/订阅模式,该模式用于为对象实现发布/订阅功能:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。

以上是事件/监听器、观察者模式的简要说明。结合这次的需求理解,当触发用户访问事件,它的观察者进行处理。观察者可以是多个,本例仅做入库操作。

创建事件/监听器

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

  1. /** 
  2.   * The event listener mappings for the application. 
  3.   * 
  4.   * @var array 
  5.   */ 
  6.  protected $listen = [ 
  7.    Registered::class => [ 
  8.      SendEmailVerificationNotification::class
  9.    ], 
  10.    'App\Events\UserBrowse' => [ 
  11.      'App\Listeners\CreateBrowseLog'
  12.      // 其它监听器 
  13.    ], 
  14.  ]; 

添加好之后,执行 php artisan event:generate,会自动创建对应的事件/监听器。分别创建了 app/Events/UserBrowse.php 和 app/Listeners/CreateBrowseLog.php 两个文件。

实现代码

把目光聚集到事件 app/Events/UserBrowse.php 文件,这里需要接收数据以便后续处理,代码如下

  1. public $ip_addr
  2. public $request_url
  3. public $city_name
  4.  
  5. /** 
  6.  * Create a new event instance. 
  7.  * 
  8.  * @return void 
  9.  */ 
  10. public function __construct($ip_addr$request_url$city_name
  11.   $this->ip_addr = $ip_addr
  12.   $this->request_url = $request_url
  13.   $this->city_name = $city_name

然后是监听器 app/Listeners/CreateBrowseLog.php,这里要做的是,将事件中接收到的数据进行入库操作,代码如下

  1. /** 
  2.    * Handle the event. 
  3.    * 
  4.    * @param UserBrowse $event 
  5.    * @return void 
  6.    */ 
  7.   public function handle(UserBrowse $event
  8.   { 
  9.     $log = new \App\Models\BrowseLog(); 
  10.  
  11.     $log->ip_addr = $event->ip_addr; 
  12.     $log->request_url = $event->request_url; 
  13.     $log->city_name = $event->city_name; 
  14.  
  15.     $log->save(); 
  16.   } 

分发事件

最后就是分发事件,修改 app/Http/Middleware/BrowseLog.php 中间件的代码,修改后如下

  1. /** 
  2.    * Handle an incoming request. 
  3.    * 
  4.    * @param \Illuminate\Http\Request $request 
  5.    * @param \Closure $next 
  6.    * @return mixed 
  7.    */ 
  8.   public function handle($request, Closure $next
  9.   { 
  10.     // 使用事件/监听器入库 
  11.     event(new UserBrowse($request->getClientIp(), $request->path(), get_city_by_ip(false, 'null'))); 
  12.       
  13.     return $next($request); 
  14.   } 

测试之后是没有问题的。

Tags: laravel事件 laravel监听器

分享到: