Laravel 5.2 验证错误
Posted
技术标签:
【中文标题】Laravel 5.2 验证错误【英文标题】:Laravel 5.2 validation errors 【发布时间】:2016-03-28 23:56:57 【问题描述】:我在 Laravel 5.2 中的验证遇到了一些问题 当我尝试像这样在控制器中验证请求时
$this->validate($request, [
'title' => 'required',
'content.*.rate' => 'required',
]);
验证器捕获错误,但不要将它们存储到会话中,所以当我尝试在模板中调用此代码时
@if (isset($errors) && count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li> $error </li>
@endforeach
</ul>
</div>
@endif
Laravel 报错
Undefined variable: errors (View: /home/vagrant/Code/os.dev/resources/views/semantic/index.blade.php)
当我尝试使用此代码进行验证时
$validator = Validator::make($request->all(), [
'title' => 'required',
'content.*.rate' => 'required'
]);
if ($validator->fails())
return redirect()
->back()
->withInput($request->all())
->withErrors($validator, 'error');
变量 $error 在模板中也不可用,但如果我尝试在控制器中显示错误
if ($validator->fails())
dd($validator->errors()->all());
错误显示,但我无法从模板访问它们。
怎么了?
【问题讨论】:
尝试 "->withErrors($validator, 'error');"没有“错误”所以:->withErrors($validator); 在 v5.2 中,您只需将 Route 放入: Route::group(['middleware' => ['web']], function () // 在此处添加您的路由 ); 【参考方案1】:自 Laravel 5.2.27 起更新
Laravel 现在默认支持 Web 中间件,您可以在此处看到:source
换句话说,您不再需要将路由包装在 Web 中间件组周围,因为它会在 RouteServiceProvider 文件中为您完成。但是,如果您使用的是 5.2.0 到 5.2.26 之间的 Laravel 版本,请参考以下方法:
以下仅适用于 Laravel 5.2.0 到 5.2.26
没有看到您的 routes.php
或 Kernel.php
文件,这就是我怀疑正在发生的事情。
中间件的工作方式从 5.2 和 5.1 发生了变化。在 5.1 中,您将在 app/Http/Kernel.php
文件中看到这一点:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];
此数组是您应用程序的全局 HTTP 中间件堆栈。换句话说,它们在每个请求上运行。记下这个特定的中间件:Illuminate\View\Middleware\ShareErrorsFromSession
。这就是在每个请求中添加 $errors
变量的原因。
但是,在 5.2 中,情况发生了变化,允许在同一个应用程序中同时使用 Web UI 和 API。现在,您将在同一个文件中看到:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
全局中间件堆栈现在只检查维护。您现在有一个名为“web”的中间件组,其中包含大量以前的全局中间件。请记住,在同一个应用程序中同时允许 Web UI 和 API 是这样的。
那么我们如何取回 $errors
变量呢?
在您的路由文件中,您需要在“web”中间件组中添加您的路由,以便您可以在每次请求时访问该 $errors
变量。像这样:
Route::group(['middleware' => ['web']], function ()
// Add your routes here
);
如果您不打算构建 API,另一种选择是将“网络”中间件移动到全局中间件堆栈,就像 5.1 中一样。
【讨论】:
确实,这行得通!我完全忘记了web
中间件!
请注意,如果您的路线被自动缓存,您需要在此更改时运行php artisan route:clear
。
@Dmitry 如果它解决了您的问题,请检查此答案是否正确,它可以帮助其他来到这里寻找相同问题解决方案的人!
谢谢,这比文档中的任何内容都更好。我认为 Laravel 的人为了他们自己的利益试图变得太聪明。我发现通过文档理解 5.2 真的很痛苦。
@Ken 这实际上不起作用,因为控制器不支持“可终止”中间件。但是,最近发生了一项更改,默认情况下支持 Web 中间件,我将在我的回答中更新。【参考方案2】:
尝试使用
return redirect()->back()
->withInput($request->all())
->withErrors($validator->errors()); // will return only the errors
【讨论】:
【参考方案3】:尝试替换:
->withErrors($validator, 'error');
与:
->withErrors($validator);
【讨论】:
【参考方案4】:// Replace
Route::group(['middleware' => ['web']], function ()
// Add your routes here
);
// with
Route::group(['middlewareGroups' => ['web']], function ()
// Add your routes here
);
【讨论】:
如果您添加关于后者为何起作用以及middleware
与middlewareGroups
的作用的描述会更好。谢谢!
我不太清楚(我也是 PHP 和 Laravel 的新手),但如果你查看 app\Http\Kernel.php,“web”是在 $middlewareGroups 数组中定义的。我遵循 Laravel 教程,它与“中间件”一起使用,但在我的情况下,它与“中间件组”一起使用。 :o)
这行得通!线索(我认为)是 app/Http/Kernel 中受保护变量的命名。 Thomas Kim 给出的包含这个,但直到我看到这个简单的 sn-p 才清楚。谢谢!这花了我 几个小时 来解决!【参考方案5】:
我在 laravel 5.2 中有这样的工作验证代码
首先在这样的模型中创建一个函数
在模型开始处添加这行代码
使用 Illuminate\Support\Facades\Validator;
public static function validate($input)
$rules = array(
'title' => 'required',
'content.*.rate' => 'required',
);
return Validator::make($input, $rules);
在控制器中调用这个函数来验证输入
使用 Illuminate\Support\Facades\Redirect;
$validate = ModelName::validate($inputs);
if ($validate->passes())
///some code
else
return Redirect::to('Route/URL')
->withErrors($validate)
->withInput();
现在是模板部分
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li> $error </li>
@endforeach
</ul>
</div>
@endif
最重要的是你必须像这样写你的路线
Route::group(['middleware' => ['web']], function ()
Route::resource('RouteURL', 'ControllerName');
);
【讨论】:
【参考方案6】:将路由包装在 web
中间件中,如下所示:
Route::group(['middleware' => ['web']], function ()
// Add your routes here
);
在 app\Http\Kernel.php
中将 \Illuminate\Session\Middleware\StartSession::class
从 web
$middlewareGroups
移动到 $middleware
希望它能解决你的问题。
【讨论】:
【参考方案7】:路线
Route::group(['middlewareGroups' => ['web']], function ()
// Add your routes here
Route::resource('/post', 'PostController');
);
功能
public function store(Request $request)
$this->validate($request, [
//input field names
'title' => 'required|max:20',
'body' => 'required',
]);
查看
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li> $error </li>
@endforeach
</ul>
</div>
@endif
【讨论】:
【参考方案8】:这会起作用
Route::group(['middlewareGroups' => ['web']], function ()
// Add your routes here
);
这也有效
Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'myController@function'
));
【讨论】:
【参考方案9】:// Controller
$this->validateWith([
'title' => 'required',
'content.*.rate' => 'required',
]);
// Blade Template
@if ($errors->has('title'))
<span class="error">
<strong> $errors->first('title') </strong>
</span>
@endif
@if ($errors->has('anotherfied'))
<span class="error">
<strong> $errors->first('anotherfied') </strong>
</span>
@endif
找到documentation。
【讨论】:
以上是关于Laravel 5.2 验证错误的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试为 user 和 admin 实现 laravel 5.2 多重身份验证。但是未定义身份验证用户提供程序 [] 错误给出