みなさん、こんにちは。
今回は、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で返るようになったかと思います◎