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 explode函数实例代码
Feb 27 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
php不用正则验证真假身份证
Nov 06 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
PHP实现模仿socket请求返回页面的方法
Nov 04 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
php 策略模式原理与应用深入理解
Sep 25 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 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函数
2010/01/11 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
django框架创建应用操作示例
2019/09/26 Python
python opencv进行图像拼接
2020/03/27 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
python cookie反爬处理的实现
2020/11/01 Python
中英双版中文教师求职信
2013/10/27 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
装修设计师求职信
2014/02/26 职场文书
五一手机促销方案
2014/03/08 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript