tp记录后台操作日志

该博客介绍了如何利用ThinkPHP6的模型事件和后置中间件来优化后台系统的日志操作记录,避免了同步写入的性能损耗和冗余代码。通过监听模型的写入前后动作,以及注册事件订阅类,实现了日志的自动记录,并在后置中间件中处理日志写入,大大提高了系统的效率和可维护性。

最近leader让我优化一下之前后台系统的日志操作记录,在网上没有找到一个可用的demo后,决定自己手撸日志

问题复现

旧的实现是在写入数据库后同步新增操作日志的,就好像下面这样。

# 修改数据库
Db::name('la_public_lang')->where('id',$postData['id'])->update($data);
# 同步写入日志
$this->operateLog($this->get_type(),'公共语
言','la_public_lang',$postData['id'],$oldLang,'修改成功',1); // 写入操作日志 

可以看出这样的缺点很明显:

  1. 同步写入,速度大打折扣

  2. 每次都要调用,冗余代码

  3. 后期维护很麻烦

怎么办呢?

这时候就要用到TP框架的模型事件和后置中间件了。

模型事件:https://www.kancloud.cn/manual/thinkphp6_0/1037598

后置中间件:https://www.kancloud.cn/manual/thinkphp6_0/1037493

注意点

官方原话:模型事件只在调用模型的方法生效,使用查询构造器操作是无效的

# 也就是说 下面这种清空是不会走到模型事件中去的
PackagesModel::where('id', $id)->update($put);
# 需要这样修改
PackagesModel::find($id)->update($put);

实现过程

在事件中监听写入前后的动作,以及注册一个事件订阅类

app\admin\event.php

<?php
// 事件定义文件
use app\subscribe\admin\Log;

return [
    'bind' => [
    ],

    'listen' => [
        'HttpRun'         => [],
        'HttpEnd'         => [],
        'LogLevel'        => [],
        'LogWrite'        => [],
        'AfterInsert'  => [],
        'BeforeUpdate' => [],
        'AfterUpdate' => [],
        'BeforeDelete' => [],
    ],

    'subscribe' => [
        Log::class
    ],
];

在模型基类中用自定义的事件重写模型事件

app\admin\model\Base.php

public static function onAfterInsert(Model $model)
{
   
   
    event('AfterInsert', $model);
}

public static function onBeforeUpdate($model)
{
   
   
    event('BeforeUpdate', $model);
}

public static function onAfterUpdate($model)
{
   
   
    event('AfterUpdate', $model);
}

public static function onBeforeDelete(Model $model)
{
   
   
    event('BeforeDelete', $model);
}

在自定义的事件订阅类中实现具体的业务逻辑

app\admin\subscribe\Log.php

<?php
declare (strict_types=1);

namespace app\admin\subscribe;

use extend\redis\Redis;
use think\Model;
use think\
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值