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.ini中文版(2)
Oct 09 PHP
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
php生成略缩图代码
Jul 16 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
php获取一个变量的名字的方法
Sep 05 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP 布尔值的自增与自减的实现方法
May 03 PHP
PHP的PDO预处理语句与存储过程
Jan 27 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
Laravel实现ApiToken认证请求
Oct 14 PHP
PHP实现文件上传操作和封装
Mar 04 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+mysql写的留言本
2006/10/09 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
php中__toString()方法用法示例
2016/12/07 PHP
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
Flask Web开发入门之文件上传(八)
2018/08/17 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
运动会领导邀请函
2014/01/10 职场文书
初中校园广播稿
2014/02/02 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
就业意向书范文
2014/04/01 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
行政主管岗位职责
2015/02/03 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
李强优秀员工观后感
2015/06/16 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
总结Python连接CS2000的详细步骤
2021/06/23 Python
python基础之模块的导入
2021/10/24 Python