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.
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
intowithErrors
which doesn't make sense because there's no variablevalidator
.The
validate
method will throw anIlluminate\Foundation\Validation\ValidationException
if there is a validation error. This exception should be listed in the$dontReport
instance variable inApp\Exceptions\Handler
as seen below: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:
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()
.The errors block should be:
Assuming you're using Bootstrap for the alerts.
You also don't have
$validator
defined. You need to do something like this:Instead of
$this->validate()
.That should do it.
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.