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 相关文章推荐
图形数字验证代码
Oct 09 PHP
投票管理程序
Oct 09 PHP
php生成随机数或者字符串的代码
Sep 05 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
php通过rmdir删除目录的简单用法
Mar 18 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
tp5框架的增删改查操作示例
Oct 31 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
Aug 30 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
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
Python实现获取网站PR及百度权重
2015/01/21 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
安装Python的教程-Windows
2017/07/22 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python实现门限回归方式
2020/02/29 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
教师应聘个人求职信
2013/12/10 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
庆七一活动总结
2014/08/27 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
债务纠纷代理词
2015/05/25 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书