我在Laravel 5.2中验证有些麻烦当我在这样的控制器中尝试验证请求时
$this->validate($request, [ 'title' => 'required', 'content.*.rate' => 'required', ]);
验证器捕获错误,但不将它们存储到会话中,所以当我尝试在模板中调用此代码时
@if (isset($errors) && count($errors) > 0)@endif@foreach ($errors->all() as $error)
- {{ $error }}
@endforeach
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()); }
错误显示但我无法从模板访问它们.
怎么了?
从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,另一种选择是将"Web"中间件移动到全局中间件堆栈,如5.1中所示.
尝试使用
return redirect()->back() ->withInput($request->all()) ->withErrors($validator->errors()); // will return only the errors