API リクエストのバリデーションをフォームリクエストで行うとき、バリデーションエラーのときのレスポンスが意図していたものと違った( json で返ってこなかった)ので、 json でレスポンスされる方法を調べてみました。
エラーレスポンスを json で返す
エラーレスポンスの定義はfailedValidation
メソッドをオーバーライドして書きます(ここがミソです)。failedValidation
メソッドをオーバーライドしていないと、バリデーションエラーの場合にホームにリダイレクトされたりします。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
// ↓追加する
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class ApiValidation 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 [
'title' => 'required'
];
}
/**
* エラー時のレスポンスを定義
*/
protected function failedValidation(Validator $validator) {
$res = response()->json([
'status' => 400,
'errors' => $validator->errors(),
], 400);
throw new HttpResponseException($res);
}
}