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