当前位置: 首页 > news >正文

[笔记] hyperf event

事件

模型事件实现于 psr/event-dispatcher 接口。

自定义监听器

得益于 hyperf/event 组件的支撑,用户可以很方便的对以下事件进行监听。例如 QueryExecuted , StatementPrepared , TransactionBeginning , TransactionCommitted , TransactionRolledBack 。接下来我们就实现一个记录SQL的监听器,来说一下怎么使用。首先我们定义好 DbQueryExecutedListener ,实现 Hyperf\Event\Contract\ListenerInterface 接口并对类定义 Hyperf\Event\Annotation\Listener 注解,这样 Hyperf 就会自动把该监听器注册到事件调度器中,无需任何手动配置,示例代码如下:

<?php
declare(strict_types=1);
namespace App\Listeners;
use Hyperf\Database\Events\QueryExecuted;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Logger\LoggerFactory;
use Hyperf\Utils\Arr;
use Hyperf\Utils\Str;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
/*** @Listener*/
class DbQueryExecutedListener implements ListenerInterface
{/*** @var LoggerInterface*/private $logger;public function __construct(LoggerFactory $loggerFactory){$this->logger = $loggerFactory->get('sql');}public function listen(): array{return [QueryExecuted::class,];}/*** @param QueryExecuted $event*/public function process(object $event){if ($event instanceof QueryExecuted) {$sql = $event->sql;if (! Arr::isAssoc($event->bindings)) {foreach ($event->bindings as $key => $value) {$sql = Str::replaceFirst('?', "'{$value}'", $sql);}}$this->logger->info(sprintf('[%s] %s', $event->time, $sql));}}
}

模型事件

模型事件与 EloquentORM 不太一致,EloquentORM 使用 Observer 监听模型事件。Hyperf 直接使用 钩子函数 来处理对应的事件。如果你还是喜欢 Observer 的方式,可以通过 事件监听,自己实现。当然,你也可以在 issue#2 下面告诉我们。

钩子函数

事件名触发实际是否阻断备注
booting模型首次加载前进程生命周期中只会触发一次
booted模型首次加载后进程生命周期中只会触发一次
retrieved填充数据后每当模型从DB或缓存查询出来后触发
creating数据创建时
created数据创建后
updating数据更新时
updated数据更新后
saving数据创建或更新时
saved数据创建或更新后
restoring软删除数据回复时
restored软删除数据回复后
deleting数据删除时
deleted数据删除后
forceDeleted数据强制删除后

针对某个模型的事件使用十分简单,只需要在模型中增加对应的方法即可。例如下方保存数据时,触发 saving 事件,主动覆写 created_at 字段。

<?php
declare(strict_types=1);
namespace App\Models;
use Hyperf\Database\Model\Events\Saving;
/*** @property $id* @property $name* @property $gender* @property $created_at* @property $updated_at*/
class User extends Model
{/*** The table associated with the model.** @var string*/protected $table = 'user';/*** The attributes that are mass assignable.** @var array*/protected $fillable = ['id', 'name', 'gender', 'created_at', 'updated_at'];protected $casts = ['id' => 'integer', 'gender' => 'integer'];public function saving(Saving $event){$this->setCreatedAt('2019-01-01');}
}

事件监听

当你需要监听所有的模型事件时,可以很方便的自定义对应的 Listener,比如下方模型缓存的监听器,当模型修改和删除后,会删除对应缓存。

<?php
declare(strict_types=1);
namespace Hyperf\ModelCache\Listener;
use Hyperf\Database\Model\Events\Deleted;
use Hyperf\Database\Model\Events\Event;
use Hyperf\Database\Model\Events\Saved;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\ModelCache\CacheableInterface;
/*** @Listener*/
class DeleteCacheListener implements ListenerInterface
{public function listen(): array{return [Deleted::class,Saved::class,];}public function process(object $event){if ($event instanceof Event) {$model = $event->getModel();if ($model instanceof CacheableInterface) {$model->deleteCache();}}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Html中嵌入module类型的JavaScript代码,如何访问其中的函数或变量?
  • 数论之高斯消元
  • Spring父子容器
  • 文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(三)
  • 神经重建在自动驾驶模拟中的应用
  • CSS盒子模型(三)
  • 解读“酒过三巡,菜过五味”:三巡是多长时间?五味是哪五味?
  • ProtoBuf简要介绍与快速上手使用(C++版)
  • 回调函数的使用
  • 【STM32】看门狗
  • 【Apache Doris】周FAQ集锦:第 19 期
  • pytest自定义命令行选项
  • ML307R_APP_DEMO_SDK TCP/UDP使用介绍
  • 【vue】编辑器段落对应材料同步滚动交互
  • [底层原理] C/C++获取时间(将时间戳转换为年月日)?
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • AngularJS指令开发(1)——参数详解
  • crontab执行失败的多种原因
  • ES6 学习笔记(一)let,const和解构赋值
  • fetch 从初识到应用
  • flask接收请求并推入栈
  • Java多态
  • js 实现textarea输入字数提示
  • JS题目及答案整理
  • LeetCode29.两数相除 JavaScript
  • nodejs实现webservice问题总结
  • October CMS - 快速入门 9 Images And Galleries
  • pdf文件如何在线转换为jpg图片
  • React 快速上手 - 07 前端路由 react-router
  • React16时代,该用什么姿势写 React ?
  • React-生命周期杂记
  • Ruby 2.x 源代码分析:扩展 概述
  • 编写高质量JavaScript代码之并发
  • 关于Java中分层中遇到的一些问题
  • 前端相关框架总和
  • 入手阿里云新服务器的部署NODE
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 学习ES6 变量的解构赋值
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​iOS实时查看App运行日志
  • #define用法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Lua:Lua调用C++生成的DLL库
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $.ajax,axios,fetch三种ajax请求的区别
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (02)vite环境变量配置
  • (1)STL算法之遍历容器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (免费分享)基于springboot,vue疗养中心管理系统