Laravel 5.2 validation errors not appearing
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.
user1072337
Updated on June 08, 2022Comments
-
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.