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 相关文章推荐
PHP与C#分别格式化文件大小的代码
May 14 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
PHP读取xml方法介绍
Jan 12 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
php反射应用示例
Feb 25 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
Dec 10 PHP
php 判断页面或图片是否经过gzip压缩的方法
Apr 05 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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类
2006/10/09 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
js模拟类继承小例子
2010/07/17 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
python语音识别实践之百度语音API
2018/08/30 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
sort命令的作用和用法
2013/08/25 面试题
我的中国梦演讲稿400字
2014/08/19 职场文书
办理收楼委托书范本
2014/10/09 职场文书
公务员政审材料范文
2014/12/23 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
党员身份证明材料
2015/06/19 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android