刪除動物以及異常處理

今天也是先把簡單的處理完,今天來製作,刪除動物功能。

MethodURINameActionMiddleward
DELETEapi/animal/{animal}animal.destroyApp\Http\Controllers\AnimalController@destroyapi

用 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 並附上錯誤資訊。

再送一次相同請求!如下圖表示成功囉!

Victor
Victor

哈囉!

文章: 220

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *