Create、Read、Update、Delete是基本資料庫操作方式,但每個方法都寫一個router uri跟controller這樣的工作量太大也不合理,因此建議使用 RESTful API來處理。
REST是一種設計風格,全名為 Representational State Transfer 。
符合RESTful API,可以讓router裡的action name減少,透過同一組名稱使用http原生方法達到API操作,讓URI設計易理解易閱讀。
Laravel有幾種產生RESTful API的方式,這篇的model名稱以userWater(個人飲水為例),分述如下
php artisan make:controller userWater --resource
controller內會 自動產生以下7種method
public function index()
public function create()
public function store(Request $request)
public function show($id)
public function edit($id)
public function update(Request $request, $id)
public function destroy($id)
php artisan make:controller userWater --api
controller內會自動產生以下5種method
public function index()
public function store(Request $request)
public function show($id)
public function update(Request $request, $id)
public function destroy($id)
php artisan make:model userWater -rmc
terminal response如下
Model created successfully.
Created Migration: 2020_09_12_160653_create_user_waters_table
Controller created successfully.
可看到指令會產生除了7種方法的controller之外,還提供了model、table。
Laravel 提供了RESTful更簡潔的寫法
//1組寫法
Route::apiResource('userWater', 'UserWaterController');
//2組寫法
Route::apiResources([
'userWater' => 'UserWaterController',
'posts' => 'PostController',
]);
使用Route::apiResource的寫法,可對應在官網文件中,可以知道7種controller的方法(Action)分別對應的路由(URI)如下
Http Verb | URI | Action | Route Name |
---|---|---|---|
GET | /userWater | index | userWater.index |
GET | /userWater/create | create | userWater.create |
POST | /userWater | store | userWater.store |
GET | /userWater/{userWater} | show | userWater.show |
GET | /userWater/{userWater}/edit | edit | userWater.edit |
PUT/PATCH | /userWater/{userWater} | update | userWater.update |
DELETE | /userWater/{userWater} | destroy | userWater.delete |
建立好model、migrate完table,加上了解以上路由對應的方法後,就可以開始處理RESTful API囉!
以新增一筆userWater(飲水紀錄為例),寫在 store的 action中
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//要validate的rules
$rules = [
"user_id" => "required|string | regex:/^[0-9]+$/",
"water" => "required | integer "
];
//回覆validate錯誤訊息
$validResult = $this->customValidate($request, $rules);
if (!is_null($validResult)){
return response()->json(['success' => false, 'message' =>$validResult , 'data'=> null ],400);
}
//新增一筆
$newRecord = userWater::create([
'user_id' => $request->user_id,
'water' => $request->water
]);
//判斷成功或失敗,提供回覆資訊
if ($newRecord) {
return response()->json(['success' => true, 'message' => "add success", 'data' => null], 200);
} else {
return response()->json(['success' => false, 'message' => "add error", 'data' => null], 400);
}
}
成功就回覆http status code 200。
失敗就回覆http status code 400,並加上失敗原因提示。
參考資料
https://medium.com/itsems-frontend/api-%E6%98%AF%E4%BB%80%E9%BA%BC-restful-api-%E5%8F%88%E6%98%AF%E4%BB%80%E9%BA%BC-a001a85ab638
https://www.footmark.info/programming-language/design/restful-webapi-design-guide/
https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E6%93%8D%E7%B8%B1%E8%AA%9E%E8%A8%80
https://ithelp.ithome.com.tw/articles/10227685
https://laravel.com/docs/7.x/controllers