値を検証に投稿し、ドキュメントに記載されているreturn view
ではなくjsonとして応答を返そうとしています。
$validator = Validator::make($request->all(), [
'about' => 'min:1'
]);
if ($validator->fails()) {
return response()->json(['errors' => ?, 'status' => 400], 200);
}
投稿はajaxによって作成されているため、ajaxでも応答を受け取る必要があります。
応答を返す際にページが更新されないようにするには、配列の外側にステータスコード200を指定する必要があることがわかりました。しかし、私は'errors'
部分を何に与えるべきかわかりませんでした。そこで何を書けばいいですか?
エラーを含むバリデーターに関するすべての情報を含む配列を返す$validator->messages()
を使用できます。 json
関数は配列を取り、json文字列としてエンコードします。
if ($validator->fails()) {
return response()->json($validator->messages(), 200);
}
Laravel 5.4では、validate()
メソッドは、リクエストがAJAXリクエストであるかどうかを自動的に検出し、それに応じてバリデーターの応答を送信できます。
ドキュメントを参照してください here
検証が失敗した場合、リダイレクト応答が生成され、ユーザーを以前の場所に送り返します。エラーはセッションにフラッシュされるため、表示できます。リクエストがAJAXリクエストであった場合、検証エラーのJSON表現を含む422ステータスコードを含むHTTPレスポンスがユーザーに返されます。
したがって、次のことが簡単にできます。
Validator::make($request->all(), [
'about' => 'min:1'
])->validate();
Ajaxリクエストを送信すると、JSONレスポンスが自動的に取得されると思います。
あなたの例に基づいて、このような何かが適切かもしれません:
$validator = \Validator::make($request->all(), $this->rules());
if ($validator->fails()) {
return response()->json($validator->errors(), 422)
}
私は既存のプロジェクトでこのコードをAPIに使用しています。
$validator = Validator::make($request->all(), [
'ride_id' => 'required',
'rider_rating' => 'required',
]);
if ($validator->fails()) {
return response()->json($validator->errors(), 400);
}
カスタムリクエストクラスを作成している場合は、public function response(array $errors)
メソッドをオーバーライドし、Validator
を明示的に指定せずに変更された応答を返すことができます。
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\JsonResponse;
class CustomRequest extends FormRequest
{
public function rules()
{
$rules = [
//custom rules
];
return $rules;
}
public function response(array $errors)
{
return new JsonResponse(['error' => $errors], 400);
}
}
Laravel JSON応答が必要です。このヘッダーをリクエストに追加してください:
'Accept: application/json'
そしてLaravelはJSONレスポンスを自動的に返します