概要
Laravelのバリデートに引っかかった場合(コントローラ以降の処理中に下のような記載をする)、
Validator::make($request->all(), [
'a' => 'bail|required',
])->validate();
に、レスポンスをJSON形式で返してくれるようにする。
※何故かHTML返される人向け
対応
リクエストヘッダに、↓を付与する。
X-Requested-With: XMLHttpRequest
備考
-
公式ドキュメントに
AJAXリクエストにvalidateメソッドを使う場合、Laravelはリダイレクトレスポンスを生成しません。
という記載がある。 -
\Illuminate\Http\Request
内のajax()
メソッド内の、isXmlHttpRequest()
へジャンプすると↓になっている。
return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
のが、決めて。
実際のところは。。
ヘッダがないと、リダイレクトでhtmlに飛んでしまうのはちょっとアレなので、手動でハンドリングした方が良いかもですね。。
Route::get('/hoge', function (Request $request) {
$validation = Validator::make($request->all(), ['aaaa' => 'required']);
if ($validation->fails()) {
return $validation->messages();
}
return ['aaaaa' => 'bbbbbb'];
});
もしくは(こっち推奨)
class TestRequest extends FormRequest
{
public function rules()
{
return ['aaaa' => 'required',];
}
public function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
throw new HttpResponseException(response()->json($validator->errors(), 422));
}
}
Route::get('/hoge', function (TestRequest $request) {
return ['aaaaa' => 'bbbbbb'];
});
もしくは、Handler.phpのなかでValidationExceptionがでた時用の共通処理でJSONをreturnするようにする。
※例外がValidationExceptionかどうかをチェックして、そうであれば。。みたいな感じ
※これが、一番良い気がする。