87 lines
2.4 KiB
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);
|
|
}
|
|
}
|