在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。
建立form request:
$ php artisan make:request ArticleRequest
- 可以發現,Form Request檔案會被建立在app/Http/Requests路徑下。
- authorize method是用來檢查授權的,比如這是一個刪除文章的api,這邊就可以寫檢查邏輯,確認這篇文章是不是目前登入的user的,如果是才能刪除,回傳true,否則回傳false。
- rules method則是定義驗證規則的地方。
範例程式碼:
- messages method: 客製化錯誤訊息。
- attributes method: 客製化錯誤欄位名稱(:attribute)。
- 由於這個範例api是把參數帶在route中,也就是用route parameter的方式,因此Form Request的all method邏輯是把route parameter加到validation data再回傳整個array,如此在rules中才可以用'id' = 'required|integer|min:1',來定義id的format,否則沒有all method定義的話,系統會找不到id這個參數!
- 在form request通過驗證後,在controller中$request-validated()則是可以回傳被驗證後的參數。
- 若是authorize method回傳false,則整個api會回傳403,controller不會被執行。
- 值得一提的是,request headers必須帶上Accept: application/json,rules method在驗證錯誤時才會回傳status code 422 的 json response,否則都會回傳404 Not Found,不會含有錯誤訊息。