From cc7b861883ed277560ac7bbb6f4eddf22934a9e7 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Tue, 11 Oct 2022 15:35:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=20JSON=20=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Kernel.php | 1 + app/Http/Middleware/FormatJsonResponse.php | 86 ++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 app/Http/Middleware/FormatJsonResponse.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index bd3139f..32fdea3 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -42,6 +42,7 @@ class Kernel extends HttpKernel \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\FormatJsonResponse::class, ], ]; diff --git a/app/Http/Middleware/FormatJsonResponse.php b/app/Http/Middleware/FormatJsonResponse.php new file mode 100644 index 0000000..a85ceae --- /dev/null +++ b/app/Http/Middleware/FormatJsonResponse.php @@ -0,0 +1,86 @@ +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); + } +}