iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
0
自我挑戰組

Junior 後端工程師歷程系列 第 9

Day 09: Laravel 打造一組 API 系列 (5) - Handler 與 API 錯誤回傳的小秘密

  • 分享至 

  • xImage
  •  

今天來分享一個小技巧~

問題點

當我們對下方三支路由請求時,如果所帶的 id 在資料庫內不存在(請求不存在資源時),常常會造成 Exception 拋出~

Route::get('books/{id}', 'BookController@show');
Route::put('books/{id}', 'BookController@update');
Route::delete('books/{id}', 'BookController@destroy');

[Tips] 利用 Eloquent 的 findOrFail 方法可以順利讓函式在搜尋不到資料時拋出 ModelNotFoundException

我們先來試試修改這支 API ( GET api/books/{id} )

修改 BookController.php 內的 show 方法

public function show($id)
{
    $book = Book::findOrFail($id);
    return $book;
}

當我們對一個不存在的資源請求時:

發現其實是一個錯誤回傳的頁面,但這不是我們要的~開發 API 所需要回傳的錯誤應該是 json 格式。
那我們要如何攔截例外並讓他以 json 的格式回傳給我們呢?

方法 1. 在 Controller 內以添加 try-catch 的方式攔截例外

use Illuminate\Database\Eloquent\ModelNotFoundException; 

public function show($id)
{
    try {
        $book = Book::findOrFail($id);
    } catch (ModelNotFoundException $th) {
        return response()->json(['資源不存在'], 404);
    }

    return $book;
}

這樣似乎能夠成功解決問題,但如果每次要做錯誤攔截都要在 function 加上 try-catch 感覺就很繁瑣。/images/emoticon/emoticon02.gif

沒關係我們還有其他招數:

方法 2. 透過 Handler 來全局響應

在 app/Exceptions/Handler.php 下的 render function 內加入

public function render($request, Exception $exception)
{
    if ($exception instanceof ModelNotFoundException) {
        // 回傳資源時 使用 Model::findOrFail 找不到資源時統一回傳
        return response()->json('資源不存在', 404);
    }

    return parent::render($request, $exception);
}

此時我們的 BookController 就能保持乾淨整潔啦!

public function show($id)
{
    $book = Book::findOrFail($id);
    return $book;
}

透過方法二可以快速解決 API 存取不存在資源時的 Json 響應回傳!

明天見拉~~


上一篇
Day 08: Laravel 打造一組 API 系列 (4) - 自己建立超方便好用的全局函數吧!
下一篇
Day 10: Laravel 打造一組 API 系列 (6) - 驗證什麼的 Laravel 都幫你準備好了!
系列文
Junior 後端工程師歷程10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言