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 相关文章推荐
基于mysql的论坛(4)
Oct 09 PHP
坏狼的PHP学习教程之第2天
Jun 15 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
PHP实现搜索相似图片
Sep 22 PHP
php语言的7种基本的排序方法
Dec 28 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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代码
2013/03/24 PHP
ThinkPHP控制器详解
2015/07/27 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
node 版本切换的实现
2020/02/02 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python中文编码问题小结
2014/09/28 Python
Python中decorator使用实例
2015/04/14 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
python根据多个文件名批量查找文件
2019/08/13 Python
材料加工硕士生求职信
2013/10/10 职场文书
七年级音乐教学反思
2014/01/26 职场文书
留学自荐信写作方法
2014/01/27 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
教职工代表大会主持词
2014/04/01 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
新郎结婚保证书
2015/02/26 职场文书
安全生产培训心得体会
2016/01/18 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js