2017-04-03 26 views
2

我正在使用Laravel 5.4。我有一個自定義表單請求類在那裏我有我的驗證規則和信息,我用它在我的控制器類似如下:使用自定義窗體請求類時檢查是否有任何驗證錯誤

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

我使用AJAX來發送請求,當有任何驗證錯誤,Laravel拋出帶有422狀態碼的HTTP響應的錯誤,包括驗證錯誤的JSON表示。

但我不想那樣。相反,我的控制器的方法裏面,我想看看是否有任何驗證錯誤,如果有任何話,我想返回與驗證消息一起其他一些數據的響應,這樣的:

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

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

能否請你幫忙 ? 在此先感謝。

回答

3

最簡單的方法是覆蓋Form Request類的response()方法。

要做到這一點,你可以簡單地添加類似下面給你的類:

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

    return parent::response($errors); 
} 

不要爲獲得進口Illuminate\Http\JsonResponse

希望這有助於!

+0

它的工作!非常感謝你。它解決了我的問題,但有什麼辦法來檢查控制器內是否有任何驗證錯誤? –

+1

@black_belt不,以這種方式使用「FormRequest」的整個想法是,如果驗證沒有通過,它不會到達控制器。你唯一可能做的就是重寫這個類的'failedValidation'方法來防止拋出異常,但這意味着你將不得不找到一種方法來手動檢查它是否失敗,然後拋出你自己的錯誤。 –

+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']); 
相關問題