題記
肯定有小夥伴公司團隊強制規範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;
}
最基礎的返回分頁:
public function index(Request $request, Topic $topic)
{
// 為了截圖完整 只查 id 和 title
return $topic->paginate($request->per_page ?? 15, ['id', 'title']);
}
使用API資源類的返回詳情:
public function show(Product $product)
{
return new ProductResource($product);
}
使用API資源類的返回分頁:
public function index(Request $request, Product $product)
{
$list = $product->paginate($request->per_page ?? 15);
// 這裡把ProductResource的toArray()改了,為了截圖只保留 id 和 title
return ProductResource::collection($list);
}
最基礎的只返回操作成功:
public function update(Product $product)
{
return [];
}
返回格式:空陣列就ok啦
後記
我之前用的是在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的