一个 Laravel JSON 响应中间件,说多了都是泪

yufei       5 年, 1 月 前       2048

一个 Laravel JSON 响应中间件,说多了都是泪

JavaScriptnull 的处理真的是不让人省心,为了解决这个问题,居然要重写实现,也是够可以的了

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

重写响应中间件的时候有几个点要注意

  1. 对重定向的处理
  2. 对二进制响应的处理
  3. 对纯文本的处理
  4. 如果响应已经是自己,则忽略
  5. 重点,重点,对 NULL 的处理

应该有更轻量级的解决方法吧...

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.