在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,不會含有錯誤訊息。 本筆記參考:1. https://blog.johnsonlu.org/laravel-validation/2. https://laravel.tw/docs/5.0/validation3. https://stackoverflow.com/questions/30238285/laravel-5-how-to-validate-route-parameters4. https://www.amitmerchant.com/custom-rules-messages-laravel-form-requests/5. https://dotblogs.com.tw/voss/2018/01/11/1558426. https://stackoverflow.com/questions/31507849/how-to-force-formrequest-return-json-in-laravel-5-1/34062691#34062691