如何更加优雅的0侵入式实现 操作日志 的记录?

最终想实现

时间 操作人 操作记录 IP host
YYYY-mm-dd admin 修改:[商品] 金额 10.00->22.00; unit 1->2
新增: [商品] 金额 11.00
删除:[user] [id:1]
8.8.8.8 内网ip或主机名
YYYY-mm-dd 系统(CLI) 修改: [订单] 状态 WAITING->PAY_SUCCESS 内网ip或主机名或job名称如/app/jobs/XXXJob

0侵入式

不改动(一行都不能动)当前系统现有逻辑(控制器、业务逻辑部分)、队列的前提下实现

想法

注册个ServiceProvider或者全局中间件,在$next($request)之前开启DB::listen记录sql,根据表名、字段名找对应模型的注释比如模型这么定义:

class User extends Model {
    public $_title = '用户';
    public $_attrs = [ 'id'=>'ID', 'nickname'=>'用户昵称' ... ];
    public $_ignoreAttrs = ['created_at','updated_at'];
}

然后根据$model->getDirty()获取修改内容,根据$model->_title获取当前模型叫什么名字(用户、商品、订单历史balabala) 根据 $_ignoreAttrs 忽略哪些字段的变更比如创建时间、最后修改时间,根据$_attrs把对应字段改成中文。然后拼成一个完整字符串修改 [$model->_title] $model->_attrs[$...] $model->getOriginalAttribute($model->...) -> $model->getAttribute($model->...)

问题

如果是CLI模式下呢?怎么区分【一次】【请求】?
比如如果是一个异步任务,应该单个任务里的所有model新增、变动视为【一次[请求]】。不能视整个进程的生命周期为一次请求。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 21

监听模型不好吗?

2年前 评论
cevin (楼主) 2年前
deatil (作者) 2年前
cevin (楼主) 2年前

你可以看看这个:github.com/owen-it/laravel-auditin...
可能需要适度的调整,我之前也没有使用这个,而是照着他的思路自己实现了差不多的功能
你说的一次请求, 你可以创建一个类似于唯一请求 ID 这种
向异步任务里传递该 ID 就行

2年前 评论

为什么没试试这个呢?

点我快速remake

2年前 评论
cevin (楼主) 2年前
陈先生 (作者) 2年前
cevin (楼主) 2年前
陈先生 (作者) 2年前
  • 数据库增加一列 session_id, 我是不建议你用 listen, 可以改为全局中间件
  • 中间件前置操作为 DB::enableQueryLog
  • 中间件后置操作一次收集完所有 SQL DB::DB::getQueryLog() 得到一个数组, 这一批 SQL 都是同一次请求的
  • 然后 data_set($sqlList, *.session_id, Str::random(32))`
  • 最后 Model::insert($sqlList);
2年前 评论
cevin (楼主) 2年前

这不算0嵌入哦

2年前 评论
cevin (楼主) 2年前
Smilephp (作者) 2年前
cevin (楼主) 2年前

楼主解决问题了吗

2年前 评论
cevin (楼主) 2年前

楼主解决问题了吗

2年前 评论

CLI模式下的异步任务如果是队列的话,可以使用:任务中间件

在中间件里处理任务内所有的模型的变更

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!