67

当我想在我的 laravel 项目中注册用户时,页面总是说

未定义变量:错误(查看:/var/www/resources/views/auth/register.blade.php)“

根据 Laravel 文档,$errors应始终自动设置:

因此,重要的是要注意 $errors 变量将始终在每个请求的所有视图中可用,从而使您可以方便地假设 $errors 变量始终已定义并且可以安全使用。

当我使用时,我在每个视图上都有这个:

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

或当我想使用该$errors变量时的任何其他方式。

为什么是这样?我以前从来没有遇到过这个问题。

有人能帮助我吗?

4

9 回答 9

127

您应该确保app/Http/Kernel.phpmiddlewareGroups财产中为web您拥有:

\Illuminate\View\Middleware\ShareErrorsFromSession::class,

在这个数组中。将此与https://github.com/laravel/laravel/blob/master/app/Http/Kernel.php进行比较

编辑

看来您需要为'middleware' => 'web'正在使用的路线添加或放入\Illuminate\View\Middleware\ShareErrorsFromSession::class,属性$middleware数组

或者

在 routes.php 文件中,尝试在以下块中创建您的路线

Route::group(['middleware' => ['web']], function () {
    //routes here
});

更新 Laravel 应用程序的新版本

web请注意,如果您两次使用中间件,您也可能会遇到问题。Laravel 应用程序 5.2.27 发生了变化不要将它与您目前使用的 Laravel 框架混淆 - 您可能使用 Laravel 框架,例如 5.2.31,但在版本 5.2.24 中有 Laravel 应用程序),其中web应用了中间件自动为所有路线。因此,如果出现问题,您应该打开app/Providers/RouteServiceProvider.php文件并验证其内容。

您也可以在这里进行比较:

如果您有较新的版本(web自动应用中间件),您不应该再使用web中间件,routes.php或者您应该修改您的RouteServiceProvider方法以不应用web组中间件。否则,如果web中间件组自动应用于此提供程序并且您也在其中使用它,routes.php您可能会得到非常意外的结果。

于 2015-12-24T14:31:49.833 回答
20

我对 Laravel 5.2.x 也有同样的问题。

routes.php文件内部尝试在

Route::group(['middleware' => ['web']], function () {
    //routes here
}

陈述。

于 2015-12-28T01:03:26.953 回答
5

还要注意:如果您编写测试并且您的视图$errors 变量,请确保您不使用WithoutMiddleware trait。

于 2016-05-19T11:53:42.437 回答
4

我有类似的问题,并通过将路由添加到中间件属性数组中来解决这个问题,

它仅在php artisan route:cache随后调用(清除路由缓存)后才起作用。

我希望你们中的一些人会发现这很有用。

于 2016-02-20T18:15:10.203 回答
3

转到App\Http\Kernel.php文件。将所有$middlewareGroups属性的东西移动到$middleware.

检查更多细节 - http://www.tisuchi.com/laravel-5-2-undefined-variable-error-validation/

于 2016-03-23T05:45:32.853 回答
3

我也看到了这个错误,后来意识到我已经使用WithoutMiddlewaretrait 作为绕过此特定测试的身份验证的一种手段,但它最终也删除了验证错误绑定。所以我不得不停止使用 trait 来保持视图正常工作。

于 2016-01-02T12:17:57.967 回答
2

count 并不是真正可行的,因为它假设变量已经存在。将条件检查更改为:@if($errors->has())或只是@if($errors)

此外,如果您要重定向,请确保在您的控制器中使用它

return redirect()->back()->with('errors', $validator->messages());

编辑:现在看到您正在使用 L5.2 这可能会回答您的问题 - 您需要将您的路线放在路线组中。

Laravel 5.2 验证错误

于 2015-12-24T21:23:33.387 回答
0
protected $middleware = [              \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Social\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Social\Http\Middleware\VerifyCsrfToken::class,
];

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [

    ],

    'api' => [
        'throttle:60,1',
    ],
];

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.

让你的内核看起来像这样

于 2016-03-31T21:02:54.443 回答
0

您的问题将通过使用此方法得到解决。

Route::group(['middleware' => ['web']], function () {
        //routes should go here
});

如果这对您没有帮助,除了上面的代码之外,只需运行以下工匠命令:

php artisan key:generate

我在使用 5.2.* 时以这种方式解决了

于 2018-09-15T21:23:04.103 回答