序
最近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); // 写入操作日志
可以看出这样的缺点很明显:
-
同步写入,速度大打折扣
-
每次都要调用,冗余代码
-
后期维护很麻烦
怎么办呢?
这时候就要用到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\

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

被折叠的 条评论
为什么被折叠?



