当前位置:  开发笔记 > 编程语言 > 正文

Laravel 5.2验证错误

如何解决《Laravel5.2验证错误》经验,为你挑选了2个好方法。

我在Laravel 5.2中验证有些麻烦当我在这样的控制器中尝试验证请求时

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);

验证器捕获错误,但不将它们存储到会话中,所以当我尝试在模板中调用此代码时

 @if (isset($errors) && count($errors) > 0)
        
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@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());
            }

错误显示但我无法从模板访问它们.

怎么了?



1> Thomas Kim..:

从Laravel 5.2.27开始更新

Laravel现在默认支持Web中间件,如下所示:source

换句话说,您不再需要围绕Web中间件组包装路由,因为它在RouteServiceProvider文件中为您执行此操作.但是,如果您使用的是5.2.0和5.2.26之间的Laravel版本,请参阅以下方法:

以下仅适用于Laravel 5.2.0至5.2.26

没有看到你routes.phpKernel.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中所示.


谢谢,这是比文档中的任何内容更好的解释.我认为Laravel的家伙会为了自己的利益而过于聪明.我发现5.2通过文档来理解真正的痛苦.

2> Gowtham Selv..:

尝试使用

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有