Laravel 5.2 validation errors not appearing

只愿长相守 提交于 2019-12-02 01:08:42

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().

Mirza Vu

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.

@if(count(($errors->all()) > 0))
@foreach($errors->all() as $error)
    <div class="alert alert-danger">
        {{$error}}
    </div>
@endforeach
@endif
Chris

The errors block should be:

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
        </ul>
    </div>
@endif

Assuming you're using Bootstrap for the alerts.

You also don't have $validator defined. You need to do something like this:

$validator = Validator::make($request->all(), [
    'email' => 'required|unique:users|email|max:255',
]);

Instead of $this->validate().

That should do it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!