Laravel 5.2 验证错误

标签 laravel laravel-validation laravel-5

我在 Laravel 5.2 中的验证时遇到一些问题 当我尝试像这样在 Controller 中验证请求时

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

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

 @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 在模板中也不可用,但如果我尝试在 Controller 中显示错误

   if ($validator->fails()) {
                dd($validator->errors()->all());
            }

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

出了什么问题?

最佳答案

从 Laravel 5.2.27 开始更新

Laravel 现在默认支持 Web 中间件,您可以在此处看到:source

换句话说,您不再需要将路由包装在 Web 中间件组中,因为它会在 RouteServiceProvider 文件中为您完成此操作。但是,如果您使用的 Laravel 版本在 5.2.0 到 5.2.26 之间,请引用以下方法:

以下仅适用于 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 验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34420590/

相关文章:

mysql - Count & GroupBy 函数 Laravel

php - 使用准备好的语句时如何将参数传递给 "WHERE IN"查询?

PHP scandir 在 Laravel 中失败

php - 调用未定义的方法 Illuminate\Validation\Rules\In::__set_state()

mysql - 如何在Laravel 5中处理BIT数据类型?

jquery - chrome 更新到版本 75.0.3770.80(官方版本)(64 位)后重复请求并将数据两次保存到数据库问题

php - Laravel 5.5 验证 hasMany 关系

laravel - 使用表单请求特定的自定义验证属性

php - 如何在laravel 5.1中访问子函数内父函数的参数

php - Laravel 5 - 多对多关系 - 获取枢轴数据