小白折騰伺服器(六):使用後置中介軟體自定義介面成功返回格式

aen233發表於2019-01-31

題記

肯定有小夥伴公司團隊強制規範api返回code、message、data。
肯定有小夥伴糾結過自定義laravel的分頁返回格式,不管是用api資源類還是沒用資源類。
肯定有小夥伴是寫了公共方法,helpers檔案中或base控制器中繼承來處理正確資料返回。
肯定有小夥伴公司團隊強制要求記錄每個介面請求日誌、響應日誌。

那麼,最好的處理位置,一定是中介軟體啦

新建After中介軟體:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\JsonResponse;

class After
{
    /**
     * 記錄響應日誌,處理成功返回自定義格式
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 執行動作
        if ($response instanceof JsonResponse) {
            $oriData = $response->getData();

            $message = [
                'code'    => 0,
                'message' => 'success',
            ];

            $data['data'] = ($oriData->data ?? []) ? $oriData->data : $oriData;

            if ($oriData->current_page ?? '') {
                $data['meta'] = [
                    'total'        => $oriData->total ?? 0,
                    'per_page'     => (int)$oriData->per_page ?? 0,
                    'current_page' => $oriData->current_page ?? 0,
                    'last_page'    => $oriData->last_page ?? 0
                ];
            }

            if ($oriData->meta ?? '') {
                $data['meta'] = [
                    'total'        => $oriData->meta->total ?? 0,
                    'per_page'     => (int)$oriData->meta->per_page ?? 0,
                    'current_page' => $oriData->meta->current_page ?? 0,
                    'last_page'    => $oriData->meta->last_page ?? 0
                ];
            }

            $temp = ($oriData) ? array_merge($message, $data) : $message;

            $response = $response->setData($temp);
            iuLog('debug', 'Response Success: ', $response->getData());
            iuLog(PHP_EOL);
        }

        return $response;
    }
}

效果:

最基礎的返回詳情:
    public function show(Topic $topic)
    {
        return $topic;
    }

file

最基礎的返回分頁:
    public function index(Request $request, Topic $topic)
    {
        // 為了截圖完整 只查 id 和 title 
        return $topic->paginate($request->per_page ?? 15, ['id', 'title']);
    }

file

使用API資源類的返回詳情:
    public function show(Product $product)
    {
        return new ProductResource($product);
    }

file

使用API資源類的返回分頁:
    public function index(Request $request, Product $product)
    {
        $list = $product->paginate($request->per_page ?? 15);

        // 這裡把ProductResource的toArray()改了,為了截圖只保留 id 和 title 

        return ProductResource::collection($list);
    }

file

最基礎的只返回操作成功:
    public function update(Product $product)
    {
        return [];
    }

返回格式:空陣列就ok啦
file

後記

我之前用的是在helpers函式中新建success(),successPaginate()等方法,使用API資源的時候,helpers中新建getPaginateMeta()方法,然後使用API資源類的additional()方法。
api資源分頁的返回姿勢是這樣的

 $list = User::paginate($request->per_page ?? 15);

 return UserResource::collection(collect($list->items()))
            ->additional(getPaginateMeta($list));

這裡的筆記是,很多人想要獲得laravel分頁的data(就是不包括link,meta這些資料的主資料),其實$list->items()就是了。
如果使用這些自定義輔助函式,我需要給多個輔助函式增加['code' => 0, 'message' => 'success'] ,給多個輔助函式增加記錄日誌的地方,而且自定義的輔助方法記日誌好加,但api資源返回的日誌就不好加了....

看下日誌:iu.test 是本地環境啦,線上也ok的
file

相關文章