2016-01-05 59 views
9

升級到Laravel 5.2後,我遇到了laravel驗證器的問題。例如,當我想驗證控制器中的數據時,請使用此代碼。Laravel驗證器拋出異常而不是重定向

<?php 

namespace App\Http\Controllers; 

use App\Http\Controllers\Controller; 

class ContactController extends Controller 
{ 
    public function storeContactRequest(Request $request) 
    { 
     $this->validate($request, [ 
      '_token' => 'required', 
      'firstname' => 'required|string' 
      'lastname' => 'required|string' 
      'age' => 'required|integer', 
      'message' => 'required|string' 
     ]); 

     // Here to store the message. 
    } 
} 

但不知何故,當我進入unvalid數據不會重定向我回到以前的頁面和閃爍一些消息會話,但它會引發異常,並給了我一個500錯誤頁面回來。

這是我得到的例外。 我已經在文檔中讀過ValidationException是新的而不是HttpResponseException,但我不知道它是否與此有關。

[2016-01-05 11:49:49] production.ERROR: exception 'Illuminate\Foundation\Validation\ValidationException' with message 'The given data failed to pass validation.' in /home/vagrant/Code/twentyre-webshop/vendor/laravel/framework/src/Illuminate/Foundation/Validation/ValidatesRequests.php:70 

而當我使用一個單獨的請求類時,它只會重定向回錯誤信息。在我看來,只有在控制器中使用的驗證方法受此行爲影響。

+3

這是設計。請求類執行重定向,如果您使用ValidatesRequests trait和validate()方法手動驗證,則需要捕獲異常並自行處理。 –

+0

但是如何在控制器中像這樣使用它時如何捕獲異常? – DB93

+1

將它包裝在try/catch子句中 –

回答

4

更新您的App\Exceptions\Handler

use Illuminate\Auth\Access\AuthorizationException; 
use Illuminate\Database\Eloquent\ModelNotFoundException; 
use Symfony\Component\HttpKernel\Exception\HttpException; 
use Illuminate\Foundation\Validation\ValidationException; 

/** 
* A list of the exception types that should not be reported. 
* 
* @var array 
*/ 
protected $dontReport = [ 
    AuthorizationException::class, 
    HttpException::class, 
    ModelNotFoundException::class, 
    ValidationException::class, 
]; 

我也建議你閱讀的文檔如何遷移到laravel 5.2,因爲有一些重大的變動。例如對於這一點,ValidatesRequests特質拋出 Illuminate\Foundation\Validation\ValidationException而不是Illuminate\Http\Exception\HttpResponseException

Documentation how to migrate from Laravel 5.1 to 5.2

+0

這不會給OP他們需要的結果 - 它不會重定向到之前的頁面和閃存驗證錯誤。 –

+0

我確實添加了ValidationException到dontReport屬性,但它沒有解決我的問題。我已經閱讀了遷移文檔並將所有更改應用到了我的項目中,但這是唯一對我沒有幫助的事情。 – DB93

-3

4.2升級到5.3的時候我有同樣的問題。

此答案適合我。

覆蓋在app /異常的方法/ Handler.php

protected function convertExceptionToResponse(Exception $e) 
{ 
    if (config('app.debug')) { 
     $whoops = new \Whoops\Run; 
     $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler); 

     return response()->make(
      $whoops->handleException($e), 
      method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500, 
      method_exists($e, 'getHeaders') ? $e->getHeaders() : [] 
     ); 
    } 

    return parent::convertExceptionToResponse($e); 
} 

答案在這裏找到:https://laracasts.com/discuss/channels/laravel/whoops-20-laravel-52

+0

這與問題無關。 – brad

+0

我和問題有同樣的問題。 「Laravel驗證器拋出異常而不是重定向」。這是我遇到的問題。我用上面的解決方案修復了它。這個錯誤可能有多個原因,因此不止一個答案。我貼出來幫助那些像我一樣掙扎着這個錯誤的人。 – Robbie

1

來自laravel的示例docs。您可以使用驗證器外觀,用於自定義驗證失敗行爲

public function store(Request $request) 
{ 
    $validator = Validator::make($request->all(), [ 
     'title' => 'required|unique:posts|max:255', 
     'body' => 'required', 
    ]); 

    if ($validator->fails()) { 
     return redirect('post/create') 
        ->withErrors($validator) 
        ->withInput(); 
    } 

    // Store the blog post... 
}