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 相关文章推荐
Dedecms常用函数解析
Feb 01 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
一个简洁实用的PHP缓存类完整实例
Jul 26 PHP
php输出金字塔的2种实现方法
Dec 16 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
CakePHP框架Model函数定义方法示例
Aug 04 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 PHP
PHP实现cookie跨域session共享的方法分析
Aug 23 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时间戳使用实例代码
2008/06/07 PHP
学习php开源项目的源码指南
2014/12/21 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
浅谈Python中的字符串
2020/06/10 Python
python中pyqtgraph知识点总结
2021/01/26 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
博物馆观后感
2015/06/05 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
《学会看病》教学反思
2016/02/17 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书