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 相关文章推荐
javascript 小型动画组件与实现代码
Jun 02 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
PHP函数超时处理方法
Feb 14 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 PHP
php在linux环境中如何使用redis详解
Dec 15 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
无线电广播的开始
2002/01/30 无线电
我的论坛源代码(二)
2006/10/09 PHP
php函数与传递参数实例分析
2014/11/15 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
php集成开发环境详解
2019/09/24 PHP
常用的javascript function代码
2008/05/23 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
查看python下OpenCV版本的方法
2018/08/03 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
银行员工职业规划范文
2014/01/21 职场文书
料理师求职信
2014/01/30 职场文书
财务部总监岗位职责
2014/03/12 职场文书
绿色环保口号
2014/06/12 职场文书
污水处理保证书
2015/05/09 职场文书
2015年教研工作总结
2015/05/23 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书