停车场管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

85 lines
2.8 KiB

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ApiResponseMiddleware
{
/**
* Handle an incoming request.
* @param Request $request
* @param Closure $next
* @return JsonResponse|mixed
*/
public function handle(Request $request, Closure $next): mixed
{
$response = $next($request);
// 只处理非标准格式的 API 响应
if ($response instanceof JsonResponse) {
$content = $response->getData(true);
// 如果已经是标准响应格式,则不处理
if (isset($content['error']) && isset($content['body']) && isset($content['message'])) {
return $response;
}
// 处理错误响应
if ($response->getStatusCode() >= 400) {
$error = 500;
$message = '';
// 标准的错误响应
if (isset($content['message'])) {
$message = $content['message'];
}
// 根据状态码设置不同的错误码
if ($response->getStatusCode() === 401) {
$error = 401;
$message = $message ?: __('middleware.api.login');
} elseif ($response->getStatusCode() === 403) {
$error = 403;
$message = $message ?: __('middleware.api.permission');
} elseif ($response->getStatusCode() === 404) {
$error = 404;
$message = $message ?: __('middleware.api.resource');
} elseif ($response->getStatusCode() === 422) {
$error = 422;
$message = $message ?: __('middleware.api.data');
} else {
$message = $message ?: __('middleware.api.system');
}
// 重新包装响应
$newContent = [
'error' => $error,
'body' => (object)[],
'message' => $message,
];
// 如果是验证错误,添加错误详情
if ($response->getStatusCode() === 422 && isset($content['errors'])) {
$newContent['body'] = ['validation_errors' => $content['errors']];
}
$response->setData($newContent);
$response->setStatusCode(200);
}
// 处理成功响应
else {
// 重新包装响应
$response->setData([
'error' => 0,
'body' => $content,
'message' => '',
]);
}
}
return $response;
}
}