今天也是先把簡單的處理完,今天來製作,刪除動物功能。
Method | URI | Name | Action | Middleward |
DELETE | api/animal/{animal} | animal.destroy | App\Http\Controllers\AnimalController@destroy | api |
用 HTTP DELETE 動詞請求 api/animal/1 表示刪除 id 為 1 的動物資料。
AnimalController
// 路由有設定 animal 變數,這裡設定它是 Animal 模型,所以會自動找出該ID的實體資料
public function destroy(Animal $animal)
{
// 把這個實體物件刪除
$animal->delete();
// 回傳 null 並且給予 204 狀態碼
return response(null, Response::HTTP_NO_CONTENT);
}
完成!簡單吧!補充一下返回的response 通常我都怎麼寫的。
Delete 動詞方法如何回應資料
我都是這樣做
有找到資料,然後刪除成功,我會回傳狀態碼 204 (No Content)
的回應
可能有些需要由後端處理,檔案比較大或系統流量大,不想要讓使用者等,可以先回傳 202 (Accepted)
表示你的請求,伺服器有收到,排隊等待處理中還沒有被執行,讓前端介面有對應的處理方式不需要等待,提升使用者體驗。
如果找不到資源 回傳 404 Not Found
嘗試可不可以運行
打開 Postman 動作改為 DELETE
Headers 如下圖顯示即可
按下Send animals資料表原本有一筆資料就會被刪除囉!
如果這時候再送一次請求呢?
再送一次請求以後發現出現錯誤了 QQ
異常處理
我們來處理一下這個異常
/animal/app/Exceptions/Handler.php
public function render($request, Exception $exception)
{
// 讓它顯示一下是哪一個異常狀況
dd($exception);
return parent::render($request, $exception);
}
在render 方法中 加入 dd($exception)
讓它印出異常,Postman 再送一次請求
發現是 ModelNotFoundException
這個例外,我們來攔截這個異常
因為ID:1 的內容已經不存在資料表了,導致出現狀況
把攔截錯誤的程式碼寫在 render
方法中(原本印出異常的程式碼 dd($exception);
可以刪掉)
use use Illuminate\Database\Eloquent\ModelNotFoundException;
public function render($request, Exception $exception)
{
if ($request->expectsJson()) {
if ($exception instanceof ModelNotFoundException) {
return response()->json(
[
'error' => '找不到資源'
],
Response::HTTP_NOT_FOUND
);
}
}
return parent::render($request, $exception);
}
程式碼解釋,使用者請求回傳JSON 格式,發現有錯誤 ModelNotFoundException
被拋出,因為Model 沒有抓到資料,回傳 404 Not Found 並附上錯誤資訊。
再送一次相同請求!如下圖表示成功囉!