2016-01-05 34 views
9

Dopo l'aggiornamento a Laravel 5.2 ho riscontrato un problema con il validatore laravel. Quando voglio convalidare i dati in un controller, prendi ad esempio questo codice.Il validatore Laravel genera un'eccezione invece di reindirizzare indietro

<?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. 
    } 
} 

Ma in qualche modo quando entro i dati caduca che non mi reindirizzare torna alla pagina precedente e lampeggia alcuni messaggi alla sessione, ma innescherà un'eccezione e mi dà una pagina di errore 500 indietro.

Questa è l'eccezione che ottengo. Ho letto nella documentazione che ValidationException è nuovo invece di HttpResponseException ma non so se ha qualcosa a che fare con questo.

[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 

E quando uso una classe di richiesta separata, verrà reindirizzato nuovamente con i messaggi di errore. Mi sembra che solo il metodo di validazione utilizzato in un controller sia influenzato da questo comportamento.

+3

Questo è di progettazione. Le classi di richieste eseguono il reindirizzamento, se si convalida manualmente utilizzando il metodo ValidatesRequests trait e validate() necessario per rilevare l'eccezione e gestirla autonomamente. –

+0

Ma come faccio a rilevare l'eccezione quando la uso in questo modo in un controller? – DB93

+1

Avvolgilo nella clausola try/catch –

risposta

4

Aggiornare il App\Exceptions\Handler classe

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, 
]; 

vi consiglio anche di leggere la documentazione come migrare a laravel 5.2, perché ci sono stati alcuni cambiamenti di rottura. Per esempio, questo, ValidatesRequests tratto getta Illuminate\Foundation\Validation\ValidationException invece di Illuminate\Http\Exception\HttpResponseException

Documentation how to migrate from Laravel 5.1 to 5.2

+0

Questo non darà all'OP il risultato di cui hanno bisogno - non verrà reindirizzato alla pagina precedente e agli errori di convalida flash. –

+0

Ho aggiunto ValidationException alla proprietà dontReport ma non ha risolto il problema. Ho letto i documenti di migrazione e ho applicato tutte le modifiche al mio progetto, ma questa è l'unica cosa che non funziona per me. – DB93

-3

Ho avuto lo stesso problema durante l'aggiornamento 4,2-5,3.

Questa risposta ha funzionato per me.

l'override del metodo in app/Eccezioni/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); 
} 

Risposta trovato qui: https://laracasts.com/discuss/channels/laravel/whoops-20-laravel-52

+0

Questo non ha nulla a che fare con la domanda. – brad

+0

Ho avuto lo stesso problema della domanda. "Il validatore di Laravel lancia un'eccezione invece di reindirizzare indietro". Questo è il problema che stavo avendo. L'ho risolto con la soluzione sopra. Ci potrebbe essere più di una causa per questo errore quindi più di una risposta. Ho pubblicato per aiutare qualcuno che sta lottando con questo errore come lo ero io. – Robbie

1

Esempio da laravel doc. È possibile utilizzare la facciata Validator, per la convalida personalizzata non riesce il comportamento

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... 
}