Laravel在中间件Middleware中记录操作日志

要求: 使用sanctum方式的token验证进行获取用户信息的方式
接口注释可通过接口注释https://www.jianshu.com/p/db6f3ae2cbf3?v=1689129215067进行批量获取

1、在/app/Http/Middleware下创建OperationLog.php文件

2、日志类代码

user();//查询用户信息
          if ($user) {
              $user_id = $user->id;
          } else {
              //登录时没有token,通过手机号进行获取用户信息
              $adminService = app(\App\Services\Admin\AdminService::class);
              $admin = $adminService->existByPhone($request->getUser());
              if ($admin) {
                  $user_id = $admin->id;
              } else {
                  //没有用户信息不记录
                  return $next($request);
              }
          }

        $method = strtolower($request->method());  //操作的方法
        if ($method != 'get') { //get查询方法不记录
            $path = $request->path();  //操作的路由
            if (! in_array($path, $this->unParams)) {//过滤不验证的路由
                $input = $request->input('data');//操作的参数
            } else {
                $input = '';
            }
            $ip = $request->ip();  //操作者的IP

            self::writeLog($user_id,$input,$path,$method,$ip);
        }

        return $next($request);
    }

    /*
     * 写入日志
     */
    public  function writeLog($user_id,$input,$path,$method,$ip)
    {
        $log = new \App\Model\OperationLog();
        $log->setAttribute('handler_id', $user_id);
        $log->setAttribute('input', json_encode(1));
        $log->setAttribute('path', $path);
        $log->setAttribute('method', $method);
        $log->setAttribute('ip', $ip);
        $log->setAttribute('name', Permission::where('route', $path)->pluck('name')->toArray()[0]??'');//关联权限表获取操作名称
        $log->setAttribute('input', json_encode($input, JSON_UNESCAPED_UNICODE));
        $log->save();
    }
}

3、表字段

CREATE TABLE `operation_log` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `handler_id` int(11) DEFAULT '0' COMMENT '操作人id(添加人)',
  `path` varchar(255) DEFAULT NULL COMMENT '请求地址(路由)',
  `method` varchar(255) DEFAULT NULL COMMENT '请求方式',
  `ip` varchar(255) DEFAULT NULL COMMENT '用户ip',
  `name` varchar(255) DEFAULT NULL COMMENT '接口名称',
  `input` text COMMENT '请求参数',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=360 DEFAULT CHARSET=utf8 COMMENT='操作日志';

4、日志model

你可能感兴趣的:(Laravel在中间件Middleware中记录操作日志)