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 相关文章推荐
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
PHP实现文件下载详解
Nov 27 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 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实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
JsChart组件使用详解
2018/03/04 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
Python显示进度条的方法
2014/09/20 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python判断telnet通不通的实例
2019/01/26 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
物流管理专业大学生自荐信
2013/10/04 职场文书
标准导师推荐信(医学类)
2013/10/28 职场文书
代理商会议邀请函
2014/01/27 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
眼镜促销方案
2014/03/15 职场文书
初一学生期末评语
2014/04/24 职场文书
学生干部培训方案
2014/06/12 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
中学图书馆工作总结
2015/08/11 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android