LoginSignup
2
1

More than 3 years have passed since last update.

LaravelのバリデートエラーでJSONレスポンスを返す

Last updated at Posted at 2019-09-12

概要

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かどうかをチェックして、そうであれば。。みたいな感じ
※これが、一番良い気がする。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1