Laravel 5.2 未出现验证错误
Laravel 5.2 validation errors not appearing
我正在尝试让验证错误显示在 Laravel 中。
我有一个 UserController 设置如下:
<?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);
}
}
}
在我看来 (layout.blade.php),我已经包括:
@if (count($errors) > 0)
@foreach ($errors->all() as $error)
{{!! $errors !!}}
@endforeach
@endif
为了说明路线,我有:
Route::group(['middleware' => ['web']], function () {
Route::get('/', function (){
return view('home');
});
});
不幸的是,当我输入 "bad" 不应验证的数据时,我没有看到任何错误(但它没有存储在数据库中,所以就是这样)。
另外请注意,在呈现 blade 模板时,我看到了一个额外的“}”括号,我不确定为什么会出现该括号。
错误块应该是:
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
假设您使用 Bootstrap 作为提醒。
您也没有 $validator
定义。你需要做这样的事情:
$validator = Validator::make($request->all(), [
'email' => 'required|unique:users|email|max:255',
]);
而不是 $this->validate()
。
应该这样做。
这里有几处错误或可以改进的地方。 UserController 上的存储方法有很多奇怪的问题。 $this
将永远为真,因为对象在 php 中为真。此外,您将 $validator
传递给 withErrors
这没有意义,因为没有变量 validator
.
public function store(Request $request) {
$this->validate($request, [
'email' => 'required|unique:users|email|max:255',
]);
User::create(Request::all());
return redirect('/');
}
如果存在验证错误,validate
方法将抛出 Illuminate\Foundation\Validation\ValidationException
。此异常应列在 App\Exceptions\Handler
中的 $dontReport
实例变量中,如下所示:
protected $dontReport = [
AuthorizationException::class,
HttpException::class,
ModelNotFoundException::class,
ValidationException::class,
];
如果您更改了这些值、删除或修改了 ValidatesRequest
特征,您可能会破坏此功能。
您的报错代码也不正确:
@foreach ($errors->all() as $error)
{!! $errors->first() !!}
@endforeach
这里有 3 个变化。首先,我删除了外部错误大小检查,这实际上并没有给您带来任何好处。接下来,我修复了额外的 }
错误,un-escaping 数据的语法是 {!! $errors->first() !!}
。最后,我将此 returns 称为 ->first()
与该特定字段相关的第一个错误。
我认为重要的是要注意验证异常将创建对上一页的重定向响应。判断上一页的逻辑可以在Illuminate\Routing\UrlGenerator::previous()
.
中找到
在laravel版本5.2.41中,中间件web被抛出。
表示在Route::group(['middleware' => ['web']], function () {
内添加路由将使验证无效。
@if(count(($errors->all()) > 0))
@foreach($errors->all() as $error)
<div class="alert alert-danger">
{{$error}}
</div>
@endforeach
@endif
如果它仍然无法正常工作,并且您已经尝试了多种方法,例如
- 将
ShareErrorsFromSession::class
从 $middlewareGroups
移动到 $middleware
- 删除
web.php
到 web
中间件
尝试将请求 header 修改为
Accept: application/json
或者您也可以创建一个新的中间件来修改请求 header,如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ModifyAcceptHeaderMiddleware
{
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}
我正在尝试让验证错误显示在 Laravel 中。
我有一个 UserController 设置如下:
<?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);
}
}
}
在我看来 (layout.blade.php),我已经包括:
@if (count($errors) > 0)
@foreach ($errors->all() as $error)
{{!! $errors !!}}
@endforeach
@endif
为了说明路线,我有:
Route::group(['middleware' => ['web']], function () {
Route::get('/', function (){
return view('home');
});
});
不幸的是,当我输入 "bad" 不应验证的数据时,我没有看到任何错误(但它没有存储在数据库中,所以就是这样)。
另外请注意,在呈现 blade 模板时,我看到了一个额外的“}”括号,我不确定为什么会出现该括号。
错误块应该是:
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
假设您使用 Bootstrap 作为提醒。
您也没有 $validator
定义。你需要做这样的事情:
$validator = Validator::make($request->all(), [
'email' => 'required|unique:users|email|max:255',
]);
而不是 $this->validate()
。
应该这样做。
这里有几处错误或可以改进的地方。 UserController 上的存储方法有很多奇怪的问题。 $this
将永远为真,因为对象在 php 中为真。此外,您将 $validator
传递给 withErrors
这没有意义,因为没有变量 validator
.
public function store(Request $request) {
$this->validate($request, [
'email' => 'required|unique:users|email|max:255',
]);
User::create(Request::all());
return redirect('/');
}
如果存在验证错误,validate
方法将抛出 Illuminate\Foundation\Validation\ValidationException
。此异常应列在 App\Exceptions\Handler
中的 $dontReport
实例变量中,如下所示:
protected $dontReport = [
AuthorizationException::class,
HttpException::class,
ModelNotFoundException::class,
ValidationException::class,
];
如果您更改了这些值、删除或修改了 ValidatesRequest
特征,您可能会破坏此功能。
您的报错代码也不正确:
@foreach ($errors->all() as $error)
{!! $errors->first() !!}
@endforeach
这里有 3 个变化。首先,我删除了外部错误大小检查,这实际上并没有给您带来任何好处。接下来,我修复了额外的 }
错误,un-escaping 数据的语法是 {!! $errors->first() !!}
。最后,我将此 returns 称为 ->first()
与该特定字段相关的第一个错误。
我认为重要的是要注意验证异常将创建对上一页的重定向响应。判断上一页的逻辑可以在Illuminate\Routing\UrlGenerator::previous()
.
在laravel版本5.2.41中,中间件web被抛出。
表示在Route::group(['middleware' => ['web']], function () {
内添加路由将使验证无效。
@if(count(($errors->all()) > 0))
@foreach($errors->all() as $error)
<div class="alert alert-danger">
{{$error}}
</div>
@endforeach
@endif
如果它仍然无法正常工作,并且您已经尝试了多种方法,例如
- 将
ShareErrorsFromSession::class
从$middlewareGroups
移动到$middleware
- 删除
web.php
到web
中间件
尝试将请求 header 修改为
Accept: application/json
或者您也可以创建一个新的中间件来修改请求 header,如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ModifyAcceptHeaderMiddleware
{
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}