php artisan make:controller ProductApiController --api
Route::namespace('Api')->group(function(){
Route::apiResource('product', '\App\Http\Controllers\ProductApiController');
});
// 參數傳入要讀取的 header 名稱
$request->header('Accept');
response(Product:all())->header('X-ProductCategory-Id', 3);
規範 提供建立 API 架構時須遵守的內容
可以參考此規範建立 API
回傳 json 內容
排序
// 取得 sort 判斷排序方式
Route::get('product', function(){
// 接收 request 值或是使用預設值
$sortCloumn = $request->input('sord', 'id');
// 判斷是否為倒排序
$sortDirection = starts_with($sortCloumn, '-') ? 'desc' : 'asc';
$sortCloumn = lrtim($sortCloumn, '-');
return Product::orderBy($sortCloumn, $sortDirection)->pageinate(20);
});
過濾
* GET 參數名為 filter
* e.g. ?filter=name:test
```php
Route::get('product', function(){
$query = Product::query();
// 判斷當有輸入過濾條件, 進行過濾
$query->when($request->filled('filter'), function($query){
[$column, $value] = explode(':', request('filter'));
return $query->where($column, $value);
});
return $query->paginate(20);
});
```
為 API 的轉換器, 提供 API 回傳時所需要的格式
建立資源類別
# Class 會在 app/Http/Resources/ProductResource.php
php artisan make:resource ProductResource
// Class 繼承 Illuminate\Http\Resource\Json\JsonResponse
public function toArray($request) {
// $this 指向資料本身( Eloquent 物件 )
return [
'p_id' => $this->id,
'p_name' => $this->name,
'p_price' => $this->price,
'p_category' => $this->category->name,
// 使用嵌套取回規格的集合, 並經過 Resource 處理
'p_spec' => ProductSpecResource::collection($this->spec)
];
}
// 在 Controller 內使用
return new ProductResource(Product::findOrFail($id));
建立資源集合
# Class 會在 app/Http/Resources/ProductCollection.php
php artisan make:resource ProductCollection
// Class 繼承 Illuminate\Http\Resource\Json\ResourceCollection
public function toArray($request) {
retrun [
'data' => ProductResource::collection($this->collection)
];
}
$products = Product::paginate(20);
return new ResourceCollection($products);
// 要求以 20 筆為範圍取回一個 collection
// 主要目的限制資源, 減少資料庫負擔
$product_paginate = Product::paginate(20);
return new ResourceCollection(Product::paginate(20));