Laravel validator throws an exception instead of redirecting back

17,043

Solution 1

Update your App\Exceptions\Handler class

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

I also recommend you to read the docs how to migrate to laravel 5.2, because there were some breaking changes. For example this, ValidatesRequests trait throws Illuminate\Foundation\Validation\ValidationException instead of Illuminate\Http\Exception\HttpResponseException

Documentation how to migrate from Laravel 5.1 to 5.2

Solution 2

Example from laravel docs. You can use Validator facade, for custom validation fails behaviour

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

Solution 3

This is how I handle it in Laravel 5.3 (by modifying Handler.php)

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

Solution 4

For laravel 5.2 I had to add this line:

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

In App\Exceptions\Handler.php,and the following headers:

    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;
Share:
17,043
DB93
Author by

DB93

Updated on June 18, 2022

Comments

  • DB93
    DB93 almost 2 years

    After I upgraded to Laravel 5.2 I encountered a problem with the laravel validator. When I want to validate data in a controller take for example this 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.
        }
    }
    

    But somehow when I enter unvalid data it will not redirect me back to the previous page and flash some messages to the session but it will trigger an exception and gives me a 500 error page back.

    This is the exception I get. I have read in the documentation that the ValidationException is new instead of the HttpResponseException but I don't know if it has anything to do with this.

    [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
    

    And when I use a seperate request class it will just redirect back with the error messages. It seems to me only the validate method used in a controller is affected by this behaviour.

  • jedrzej.kurylo
    jedrzej.kurylo over 8 years
    This won't give the OP the result they need - it won't redirect to previous page and flash validation errors.
  • DB93
    DB93 over 8 years
    I did add the ValidationException to the dontReport property but it didn't fix my problem. I have read the migration documents and applied all the changes to my project but this is the only thing that is failing for me.
  • brad
    brad over 7 years
    This has nothing to do with the question.
  • Robbie
    Robbie over 7 years
    I had the same problem as the question. "Laravel validator throws an exception instead of redirecting back". That's the problem I was having. I fixed it with the solution above. There might be more than one cause for this error therefore more than one answer. I posted to help someone who is struggling with this error like I was.