2017-04-03 3 views
2

私はLaravel 5.4を使用しています。私は私の検証ルールとメッセージを持っていると私は、次のように私のコントローラでそれを使用するカスタムフォームの要求クラスがあります:私は、要求を送信するために、AJAXを使用していますカスタムフォーム要求クラスを使用しているときに検証エラーがあるかどうかをチェック

public function store(CustomFormRequest $request) 
{ 
    // 
} 

をし、任意の検証エラーがある場合に、Laravelはスロー検証エラーのJSON表現を含む422ステータスコードでのHTTP応答のエラー。

しかし、私はそれを望んでいません。代わりに、私のコントローラのメソッド内で、私は、任意の検証エラーがあるかどうかを知りたいと任意のがあるならば、私はこのように、検証メッセージと一緒にいくつかの追加データで応答を返すようにしたい:

// Inside my Controller 
public function store(CustomFormRequest $request) 
{ 
    if ($validator->fails()) 
    { 
     $errors = $validator->errors(); 

     return response()->json(array('status' => 2, 'msg' => $errors->all())); 
    } 
} 

助けてもらえますか? ありがとうございます。

答えて

3

これを行う最も簡単な方法は、フォーム要求クラスのresponse()メソッドをオーバーライドすることです。 Illuminate\Http\JsonResponse

・ホープこのことができますをインポートするために取得しないでくださいため

public function response(array $errors) 
{ 
    if ($this->expectsJson()) { 
     return new JsonResponse(['status' => 2, 'msg' => $errors], 422); 
    } 

    return parent::response($errors); 
} 

:あなたは、単にあなたのクラスに次のようなものを追加することができます。これを行うために

+0

これは機能しました。どうもありがとうございました。それは私の問題を解決しましたが、コントローラ内に検証エラーがあるかどうかを確認する方法はありますか? –

+1

@black_beltいいえ、この方法で 'FormRequest'を使う考えは、検証が合格しなければコントローラに到達しないということです。このクラスの 'failedValidation'メソッドをオーバーライドしてExceptionがスローされないようにすることができますが、失敗したかどうかを手動でチェックして独自のエラーをスローする方法を見つける必要があります。 –

+0

私の答えをチェックしてください私はあなたがしたいことを正確にしました....私はajaxを送信し、エラーがあればアラートでそれらを返し、フォームを提出しない場合は – lewis4u

0

私はコントローラのロジックを知りたいと思いますが、依然としてリクエストファイルを利用することができます。 Laravelのドキュメントでは、Adding After Hooks To Form Requestsと記載されています。

フォームリクエストに「after」フックを追加する場合は、withValidatorメソッドを使用できます。このメソッドは、バリデーションルールが実際に評価される前に、あなたがそのメソッドのいずれかを呼び出すことができるように、完全に構築バリデータを受信します。

/** 
* Configure the validator instance. 
* 
* @param \Illuminate\Validation\Validator $validator 
* @return void 
*/ 
public function withValidator($validator) 
{ 
    $validator->after(function ($validator) { 
     if ($this->somethingElseIsInvalid()) { 
      $validator->errors()->add('field', 'Something is wrong with this field!'); 
     } 
    }); 
} 
+0

私はそれを試みました私が望むようにカスタムレスポンスを投げることができます。しかし、お返事いただきありがとうございます。 –

+0

エラーと同じレベルでデータを追加したい場合は正しいです!エラーと同じ配列内に独自のメッセージがあるのであれば、私のコードを使うことができます。私はいつもLaravelにすべての仕事をさせ、できる限り多くの機能を使用することを好む。 –

0

はこれを試してみてください。

form.ajaxSubmit({ 
    async: false, 
    type: yourMethod, 
    url: yourRoute, 
    headers: { 'X-CSRF-TOKEN': "{{csrf_token()}}" }, 
    dataType: 'json', 
    success: function(data){ 
     location.href = data.redirect_to; 
    }, 
    error: function(data) { 
     var errors = data.responseJSON; 
     var errorsArr = []; 
     for (error in errors) { 
      errorsArr.push(errors[error]); 
     } 

     errorsArr = $.map(errorsArr, function(n){ 
      return n; 
     }); 

     alert("<strong class='text-danger'>" + errorsArr.join("<br>") + "</strong>"); 
     console.log(errors); 

    } 
}); 

とあなたのコントローラストアの方法で復帰を行います。

return response()->json(['redirect_to' => '/your_route']); 
関連する問題