web-dev-qa-db-ja.com

Laravel 5検証-json / ajaxとして返す

値を検証に投稿し、ドキュメントに記載されている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'部分を何に与えるべきかわかりませんでした。そこで何を書けばいいですか?

22
senty

エラーを含むバリデーターに関するすべての情報を含む配列を返す$validator->messages()を使用できます。 json関数は配列を取り、json文字列としてエンコードします。

if ($validator->fails()) {    
    return response()->json($validator->messages(), 200);
}
34
Peyman.H

Laravel 5.4では、validate()メソッドは、リクエストがAJAXリクエストであるかどうかを自動的に検出し、それに応じてバリデーターの応答を送信できます。

ドキュメントを参照してください here

検証が失敗した場合、リダイレクト応答が生成され、ユーザーを以前の場所に送り返します。エラーはセッションにフラッシュされるため、表示できます。リクエストがAJAXリクエストであった場合、検証エラーのJSON表現を含む422ステータスコードを含むHTTPレスポンスがユーザーに返されます。

したがって、次のことが簡単にできます。

Validator::make($request->all(), [
    'about' => 'min:1'
])->validate();
6
Jones03

Ajaxリクエストを送信すると、JSONレスポンスが自動的に取得されると思います。

あなたの例に基づいて、このような何かが適切かもしれません:

$validator = \Validator::make($request->all(), $this->rules());

if ($validator->fails()) {
   return response()->json($validator->errors(), 422)
}
1
iman

私は既存のプロジェクトでこのコードをAPIに使用しています。

$validator = Validator::make($request->all(), [ 
      'ride_id' => 'required',
      'rider_rating' => 'required',
  ]);

  if ($validator->fails()) {
    return response()->json($validator->errors(), 400);
  }
0
David Guetta

カスタムリクエストクラスを作成している場合は、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);
    }
}
0
minhazur

Laravel JSON応答が必要です。このヘッダーをリクエストに追加してください:

'Accept: application/json'

そしてLaravelはJSONレスポンスを自動的に返します

0
Gjaa