web-dev-qa-db-fra.com

Laravel validator lève une exception au lieu de rediriger

Après avoir mis à niveau vers Laravel 5.2, j'ai rencontré un problème avec le validateur Laravel. Lorsque je veux valider des données dans un contrôleur, prenons par exemple ce code.

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

Mais de toute façon, lorsque je saisis des données non valides, cela ne me redirige pas vers la page précédente et ne renvoie pas certains messages à la session, mais cela déclenchera une exception et me donnera une page de 500 erreurs.

C’est l’exception que j’obtiens . J'ai lu dans la documentation que l’exception ValidationException est nouvelle au lieu de l’exception HttpResponseException mais je ne sais pas si cela a un rapport avec cela.

[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

Et lorsque j'utilise une classe de requête séparée, il ne fait que rediriger les messages d'erreur. Il me semble que seule la méthode validate utilisée dans un contrôleur est affectée par ce comportement.

11
DB93

Mettez à jour votre classe 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,
];

Je vous recommande également de lire la documentation sur la migration de laravel 5.2, car certaines modifications ont été apportées. Par exemple ceci, trait ValidatesRequests jette Illuminate\Foundation\Validation\ValidationException au lieu de Illuminate\Http\Exception\HttpResponseException 

Documentation sur la migration de Laravel 5.1 à 5.2

5
xAoc

Exemple tiré de laravel docs. Vous pouvez utiliser la façade de Validator, pour que la validation personnalisée échoue

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

Voici comment je le gère dans Laravel 5.3 (en modifiant Handler.php)

https://stackoverflow.com/a/42852358/3107185

1
Rav

Pour Laravel 5.2, j'ai dû ajouter cette ligne:

    if ($e instanceof ValidationException) 
    {
         return redirect()->back()->withInput();
    }

Dans App\Exceptions\Handler.php et les en-têtes suivants:

    use Illuminate\Session\TokenMismatchException;
    use Illuminate\Database\Eloquent\ModelNotFoundException;
    use Symfony\Component\HttpKernel\Exception\HttpException;
    use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    use Illuminate\Validation\ValidationException;
    use Illuminate\Auth\AuthenticationException;
0
Eduardo Lemus

Pour ce faire, je construisais une application entièrement basée sur API dans Laravel 5.3 que j'avais mise à niveau manuellement à partir de Laravel 5.1. et j'avais juste besoin de Laravel pour répondre avec les erreurs de validation qui devaient être corrigées sur mon FormRequest.

Ajout de cette ligne:

elseif ($e instanceof ValidationException) 
 {
        return $this->convertValidationExceptionToResponse($e, $request);
 }

après celui-ci:

    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    }

Dans App\Exceptions\Handler.php a fait le tour pour moi et a renvoyé les erreurs de validation attendues lors de l'utilisation de la validation FormRequest.

Veuillez voir mes commentaires ici: Les commentaires de @ ratatatKE sur github

0
Moses Ndeda