erp-backend/app/Http/Middleware/LogOperation.php
2026-04-01 17:07:04 +08:00

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());
}
}
}