【Laravel】バリデーション失敗時の結果をJSONで返す

みなさん、こんにちは。

今回は、Laravelでバリデーション失敗時の結果をJSONで返す方法についてまとめたいと思います。

バリデーション失敗時の結果はデフォルトでは、HTMLでのレスポンスが返ってくるようです。

JSONで返したい場合は、HTMLでレスポンスが返ってこないようにする設定が必要です。

FormRequestで上記の設定を行います。

FormRequestとは?

Requestファサードを継承し、リクエストパラメータに対するバリデーションルールの定義等の機能を提供しています。

FormRequestでバリデーションを作成することにより、コントローラにはバリデーション済みのリクエストが来るので、

可読性・保守性が上がり、他のクラスでも作成することができます。

実際にJSONで返すようにするには、「failedValidation」メソッドをオーバーライドします。

例として、「SampleRequest.php」ファイルを作成します。

<?php

namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;

class SampleRequest 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 [
              'id' => 'required',
            ];
	}

	/**
	 * Handle a failed validation attempt.
	 *
	 * @param Illuminate\Contracts\Validation\Validator $validator
	 * @return void
	 */
	protected function failedValidation(Validator $validator)
	{
		if (request()->expectsJson()) {
			$errors['status'] = 'error';
			$errors['errors'] = $validator->errors()->toArray();
			$errors['errorMessages'] = $validator->errors()->all();

			throw new HttpResponseException(
				response()->json($errors, 422)
			);
		}
	}
}

何ヶ所も設定が必要な場合は、抽象クラスを作成し「failedValidation」をそこに作成します。

この抽象クラスを継承して実装してください。

以上の設定でバリデーションエラーがJSONで返るようになったかと思います◎