lcly-data-admin/app/Http/Middleware/FormatJsonResponse.php

87 lines
2.4 KiB
PHP

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