?laravel8 中介軟體對處理返回結果或異常進行格式統一處理

嚕嚕生活發表於2021-03-05

laravel菜鳥一枚,寫API介面時,搜尋沒找到可直接使用的方案,自已寫了一個有需要拿走不謝,大神勿噴!
通過修改.evn的APP_DEBUG對返回結果格式統一處理
只在laravel8裡做了一下測試,其他的版本我也就不清楚了!

<?php

namespace App\Http\Middleware;


use Illuminate\Database\QueryException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class ApiResponse
{

    /**
     * 對部分有安全隱患或者不能提示給客戶端的異常進行過濾,統一提示一個模糊的錯誤資訊
     * @var string[]
     */
    protected static $dontReport = [
        QueryException::class,
        \Exception::class
    ];

    /**
     * Handle an incoming request.
     * api介面資料返回結果內容的處理
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        $data = [
            'code' => -100000,
            'message' => '錯誤異常!'
        ];
        if ($response instanceof JsonResponse) {
            $data = ['data' => $response->getData(),
                'code' => 100000,
                'message' => ''
            ];
            $response->setData($data);
            return $response;
        }
        //如果是開啟除錯模式下,返回正常的錯誤提示頁面
        if ((boolean)env('APP_DEBUG')) {
            return $response;
        }
        //有異常的,並且不在忽略異常列表裡的異常進行資料格式化整理
        if ($response instanceof Response && $response->exception && !in_array(get_class($response->exception), self::$dontReport)) {
            $data = [
                'data' => [],
                'code' => $response->exception->getCode(),
                'message' => $response->exception->getMessage()
            ];
        }
        //返回API介面格式的JSON異常資料
        $response = new JsonResponse();
        $response->setData($data);
        return $response;
    }
}

控制器裡的使用方法

 public function demo()
{

    //丟擲異常資料
    # throw new RuntimeException('執行錯誤','-110');
    //正常返回資料內容
    return response()->json($result);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
初從文,三年不中;後習武,校場發一矢,中鼓吏,逐之出;遂學醫,有所成。自撰一良方,服之,卒。

相關文章