目的
- Laravel APIのバリデーションでpostデータが弾かれた時に初期画面にリダイレクトしてしまう問題を解決した話をまとめる
概要
- 最新のlaravelバージョンでの方法はこちら
実施環境
- ハードウェア環境
項目 | 情報 |
---|---|
OS | macOS Catalina(10.15.3) |
ハードウェア | MacBook Pro (16-inch ,2019) |
プロセッサ | 2.6 GHz 6コアIntel Core i7 |
メモリ | 16 GB 2667 MHz DDR4 |
グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |
- ソフトウェア環境
項目 | 情報 | 備考 |
---|---|---|
PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
Laravel バージョン | 7.0.8 | commposerを用いて導入 |
MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |
前提情報
-
LaravelをAPIサーバとして使用してる。
-
http://127.0.0.1:8000/api/infomation
にDBに格納して欲しいデータを持たせてpostした時にバリデーションチェックを行う実装をした。 -
バリデーションにより弾かれた時はJSONで下記の様なレスポンスが欲しい。
{ "summary": "バリデーションによりこのリクエストは拒否されました", "errors": { "infomation_title": [ "infomation title は必須です" ] } }
問題
- バリデーションで弾かれた際に
http://127.0.0.1:8000/
のhtmlがレスポンスとして帰ってきてしまう。
原因
- バリデーションルールが記載されているファイルの継承元である
アプリ名ディレクトリ/vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php
のpublic function validateResolved()
らへんが悪さをしている様である。 - このためバリデーションルールが記載されているファイルは
FormRequest::failedValidation()
でバリデーションで弾かれた際にリダイレクトを行っているらしいのでこの部分の設定をバリデーションルールが記載されているファイルで上書き(オーバーライド)してあげる。
解決方法
- 関数のオーバーライド
-
下記コマンドを実行してバリデーションルールが記載されたファイルを開く。
$ vi アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php
-
下記の内容を
class StoreContentPost extends FormRequest
内に記載する。アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.phppublic function failedValidation(Validator $validator) { $response['summary'] = 'バリデーションによりこのリクエストは拒否されました'; $response['errors'] = $validator->errors()->toArray(); throw new HttpResponseException( response()->json($response) ); }
-
- 確認
付録
-
バリデーションルールが記載されたファイルの全体を下記に記載する。
アプリ名ディレクトリ/app/Http/Requests/StoreContentPost.php<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; //下記を追加する use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; //上記までを追加する j class StoreContentPost extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'infomation_title' => 'required', 'infomation_content' => 'required', 'infomation_period_start_date' => 'required|max:8', 'infomation_period_end_date' => 'required|max:8', ]; } public function failedValidation(Validator $validator) { $response['summary'] = 'バリデーションによりこのリクエストは拒否されました'; $response['errors'] = $validator->errors()->toArray(); throw new HttpResponseException( response()->json($response) ); } }