2016-01-05 3 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. 
    } 
} 

Но как-то, когда я вхожу недействительно данные, которые он не перенаправляет меня обратно на предыдущую страницу и мигает несколько сообщений на сессию, но это вызовет исключение, и дает мне страницу 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 и 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

Это не даст ОП результат, в котором они нуждаются - он не будет перенаправляться на предыдущую страницу и ошибки проверки флеш-памяти. –

+0

Я добавил свойство ValidationException к свойству dontReport, но это не устранило мою проблему. Я прочитал документы миграции и применил все изменения к моему проекту, но это единственное, что не подходит для меня. – DB93

-3

У меня была такая же проблема при обновлении 4.2 до 5.3.

Этот ответ сработал для меня.

Override метод в приложение/Исключения/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 документов. Вы можете использовать фасад Валидатора, для того, чтобы пользовательская проверка не срабатывала.

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... 
} 
Смежные вопросы