格式化 JSON 响应数据结构
parent
84bf7cb520
commit
cc7b861883
|
|
@ -42,6 +42,7 @@ class Kernel extends HttpKernel
|
||||||
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
|
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
|
||||||
'throttle:api',
|
'throttle:api',
|
||||||
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||||
|
\App\Http\Middleware\FormatJsonResponse::class,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
class FormatJsonResponse
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
|
||||||
|
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
|
||||||
|
*/
|
||||||
|
public function handle(Request $request, Closure $next)
|
||||||
|
{
|
||||||
|
return $this->handleResponse($request, $next($request));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理响应
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @param \Symfony\Component\HttpFoundation\Response $response
|
||||||
|
* @return \Symfony\Component\HttpFoundation\Response
|
||||||
|
*/
|
||||||
|
protected function handleResponse(Request $request, Response $response): Response
|
||||||
|
{
|
||||||
|
if ($response instanceof JsonResponse) {
|
||||||
|
$response = $this->handleJsonResponse($response);
|
||||||
|
} elseif (! $response instanceof RedirectResponse && $request->expectsJson()) {
|
||||||
|
$response = new JsonResponse(
|
||||||
|
$this->wrapJson(
|
||||||
|
! $response->isEmpty() ? ['data' => $response->getContent()] : null
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$response->prepare($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理 JSON 响应
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\HttpFoundation\JsonResponse $response
|
||||||
|
* @return \Symfony\Component\HttpFoundation\JsonResponse
|
||||||
|
*/
|
||||||
|
protected function handleJsonResponse(JsonResponse $response): JsonResponse
|
||||||
|
{
|
||||||
|
return $response->setData(
|
||||||
|
$this->wrapJson(
|
||||||
|
json_decode($response->getContent())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 组装 JSON 数据
|
||||||
|
*
|
||||||
|
* @param mixed $data
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function wrapJson($data): array
|
||||||
|
{
|
||||||
|
$value = is_object($data) ? (array) $data : $data;
|
||||||
|
|
||||||
|
if (is_array($value) && Arr::hasAny($value, ['code', 'data', 'message'])) {
|
||||||
|
$data = $value;
|
||||||
|
} else {
|
||||||
|
$data = ['data' => $data];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_merge([
|
||||||
|
'code' => 0,
|
||||||
|
'data' => null,
|
||||||
|
'message' => 'ok',
|
||||||
|
], $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue