一个 Laravel JSON 响应中间件,说多了都是泪
JavaScript 对 null
的处理真的是不让人省心,为了解决这个问题,居然要重写实现,也是够可以的了
<?php namespace Module\Base\Middleware; use Closure; use Illuminate\Contracts\Support\Arrayable; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Illuminate\Http\JsonResponse as HttpJsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Response; class JsonResponse { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); // 忽略对重定向的处理。 if ($response instanceof RedirectResponse) { return $response; } // 忽略对二进制响应的处理。 if ($response instanceof BinaryFileResponse) { return $response; } // 忽略纯文本响应。 if ($response instanceof Response) { if (str_contains($response->headers->get('Content-Type'), 'text/plain')) { return $response; } } // 忽略对已经是JSON的200响应处理。 if ($response instanceof HttpJsonResponse && $response->getStatusCode() === 200) { return $response; } // 对数NULL类型进行处理。 $recstr = null; $recstr = function ($data) use(&$recstr) { if ($data instanceof Arrayable) { $data = $data->toArray(); } if (is_array($data)) { return array_map($recstr, $data); } elseif (is_null($data)) { return ''; } return $data; }; // JSON封装。 $data = [ 'status' => 200, 'message' => '', 'data' => '' ]; if ($response instanceof Response || $response instanceof HttpJsonResponse) { $data['status'] = $response->getStatusCode(); if ($data['status'] === 200) { $data['data'] = $response->getContent(); if ($response->headers->get('Content-Type') === 'application/json') { $data['data'] = json_decode($data['data']); } } else { $data['message'] = $response->getContent(); $data['data'] = ''; if ($data['status'] === 422) { $message = @json_decode($data['message']); if ($message) { $data['message'] = head(head($message)); } } } } else { $data['data'] = $response; } return response()->json($recstr($data)); } }
重写响应中间件的时候有几个点要注意
- 对重定向的处理
- 对二进制响应的处理
- 对纯文本的处理
- 如果响应已经是自己,则忽略
- 重点,重点,对
NULL
的处理
应该有更轻量级的解决方法吧...
目前尚无回复