77 lines
2.1 KiB
PHP
77 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Models\OperationLog;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class LogOperation
|
|
{
|
|
/**
|
|
* Handle an incoming request.
|
|
*
|
|
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
|
*/
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
// 记录开始时间
|
|
$startTime = microtime(true);
|
|
|
|
// 处理请求
|
|
$response = $next($request);
|
|
|
|
// 计算执行时间
|
|
$executionTime = microtime(true) - $startTime;
|
|
|
|
// 记录操作日志
|
|
$this->logOperation($request, $response, $executionTime);
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* 记录操作日志
|
|
*/
|
|
private function logOperation(Request $request, Response $response, float $executionTime): void
|
|
{
|
|
try {
|
|
// 排除一些不需要记录的路径
|
|
$excludedPaths = [
|
|
'api/operation-logs',
|
|
'api/auth/login',
|
|
'api/auth/refresh',
|
|
'sanctum/csrf-cookie',
|
|
];
|
|
|
|
$path = $request->path();
|
|
|
|
foreach ($excludedPaths as $excludedPath) {
|
|
if (strpos($path, $excludedPath) === 0) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 排除OPTIONS请求
|
|
if ($request->method() === 'OPTIONS') {
|
|
return;
|
|
}
|
|
|
|
// 获取响应数据
|
|
$responseData = [];
|
|
if ($response->headers->get('Content-Type') === 'application/json') {
|
|
$content = $response->getContent();
|
|
if ($content) {
|
|
$responseData = json_decode($content, true) ?? [];
|
|
}
|
|
}
|
|
|
|
// 记录操作日志
|
|
OperationLog::logApiRequest($request, $response, $executionTime);
|
|
} catch (\Exception $e) {
|
|
// 记录日志失败时不中断请求
|
|
\Log::error('记录操作日志失败: ' . $e->getMessage());
|
|
}
|
|
}
|
|
} |