格式化 JSON 响应数据结构
parent
84bf7cb520
commit
cc7b861883
|
|
@ -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,
|
||||
],
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -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