laravel 事件/监听器实例代码


Posted in PHP onApril 12, 2019

导语

上一篇文章实现了记录用户访问,设计上是有缺陷的,代码紧耦合在中间件。如果后续修改需求,不仅记录 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);
  }

测试之后是没有问题的。

结语

这次所做的修改,感官上来看,就是将入库操作从中间件转移到监听器中,实际上的意义远不止于此。例如同一个事件,可以分发在不同的地方;事件添加了需求,只需要在添加一个监听器即可;监听器中也可以使用队列等等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
文件上传类
Oct 09 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
php操作JSON格式数据的实现代码
Dec 24 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
php获取文件名后缀常用方法小结
Feb 24 PHP
基于PHP实现通过照片获取ip地址
Apr 26 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
Laravel5.7 数据库操作迁移的实现方法
Apr 12 #PHP
laravel使用Faker数据填充的实现方法
Apr 12 #PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 #PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 #PHP
PHP中的Iterator迭代对象属性详解
Apr 12 #PHP
PHP中str_split()函数的用法讲解
Apr 11 #PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 #PHP
You might like
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
php中如何执行linux命令详解
2018/11/06 PHP
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Python strip lstrip rstrip使用方法
2008/09/06 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
Python sublime安装及配置过程详解
2020/06/29 Python
python装饰器代码深入讲解
2021/03/01 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
美德好少年主要事迹
2014/01/29 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
先进个人材料怎么写
2014/12/30 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python