Laravel 5.2 validation errors not appearing

18,225

Solution 1

There are a couple things wrong or that can be improved here. The store method on the UserController has a lot of weird issues. $this will always be true because objects are true in php. Also, you pass in $validator into withErrors which doesn't make sense because there's no variable validator.

public function store(Request $request) {
    $this->validate($request, [
        'email' => 'required|unique:users|email|max:255',
    ]);

    User::create(Request::all());
    return redirect('/');
}

The validate method will throw an Illuminate\Foundation\Validation\ValidationException if there is a validation error. This exception should be listed in the $dontReport instance variable in App\Exceptions\Handler as seen below:

protected $dontReport = [
    AuthorizationException::class,
    HttpException::class,
    ModelNotFoundException::class,
    ValidationException::class,
];

If you have changed these values, removed, or modified the ValidatesRequest trait you may have broken this functionality.

Your error reporting code is not correct either:

@foreach ($errors->all() as $error)
   {!! $errors->first() !!}
@endforeach

There are 3 changes here. First I removed the outer errors size check, this doesn't really get you anything. Next, I fixed your extra } error, the syntax for un-escaping data is {!! $errors->first() !!}. Lastly, I called ->first() this returns the first error associated with that particular field.

I think it's important to note that the validation exception will create a redirect response to the previous page. The logic for determining the previous page can be found in Illuminate\Routing\UrlGenerator::previous().

Solution 2

In laravel version 5.2.41, the middleware web is thrown out.

Means adding the routes inside Route::group(['middleware' => ['web']], function () { will make the validation not work.

Share:
18,225
user1072337
Author by

user1072337

Updated on June 08, 2022

Comments

  • user1072337
    user1072337 almost 2 years

    I am trying to get validation errors to show up in Laravel.

    I have a UserController set up like so:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\User;
    use App\Http\Controllers\Controller;
    //Use Request;
    Use Flash;
    Use Illuminate\Http\Request;
    
    class UserController extends Controller
    {
        /**
         * Show the profile for the given user.
         *
         * @param  int  $id
         * @return Response
         */
        public function showProfile($id)
        {
            return view('user.profile', ['user' => User::findOrFail($id)]);
        }
    
        public function store(Request $request) {
            $this->validate($request, [
                'email' => 'required|unique:users|email|max:255',
            ]);
    
            if($this) {
    
            $input = Request::all();
    
            User::create($input);
    
            return redirect('/');
    
            }
            else {
    
                return redirect('/')->withErrors($validator);
            }
        }
    }
    

    In my view (layout.blade.php), I have included:

    @if (count($errors) > 0)
    @foreach ($errors->all() as $error)
       {{!! $errors !!}}
    @endforeach
    @endif
    

    To account for the route, I have:

    Route::group(['middleware' => ['web']], function () {
        Route::get('/', function (){
            return view('home');
        });
    });
    

    Unfortunately, when I enter "bad" data that shouldn't be verified, I am not seeing any error (but it is not being stored in the db, so there's that).

    One other note, when the blade template is rendered, I am seeing an extra "}" bracket, which I'm not sure why that is there.