Неопределенная переменная: ошибки в Laravel

44

Когда я хочу зарегистрировать пользователя в моем проекте laravel, страница всегда говорит

Undefined variable: errors (View:/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.

Почему это? Раньше у меня не было этой проблемы.

Кто-нибудь может мне помочь?

  • 0
    Какая версия Laravel? В частности, в вашем файле composer.lock , какую версию он тянет?
  • 0
    "версия": "v5.2.3"
Показать ещё 3 комментария
Теги:
laravel-validation
laravel-5
laravel-5.2
laravel-middleware

8 ответов

73
Лучший ответ

Вы должны убедиться, что в app/Http/Kernel.php в middlewareGroups для 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 framework, например 5.2.31, но иметь приложение Laravel в версии 5.2. 24), в котором web промежуточное программное обеспечение применяется автоматически для всех маршрутов. Поэтому в случае возникновения проблем вы должны открыть файл app/Providers/RouteServiceProvider.php и проверить его содержимое.

Вы можете сравнить его и здесь:

В случае, если у вас есть более новая версия (которая применяет связующее ПО web автоматически), вам больше не следует использовать web промежуточное ПО в routes.php, или вы должны изменить свой метод RouteServiceProvider, чтобы не применять групповое промежуточное ПО web, В противном случае, если в этом провайдере автоматически применяется группа промежуточного программного обеспечения web, и вы используете ее также в routes.php, вы можете получить очень неожиданные результаты.

  • 0
    Это уже там ... Скопируйте весь блок, чтобы быть уверенным, но это все еще не работает
  • 0
    Вы обновили приложение из более старой версии Laravel или запускаете новое приложение с нуля в Laravel 5.2?
Показать ещё 5 комментариев
17

У меня была такая же проблема с Laravel 5.2.x.

Внутри файла routes.php попробуйте создать маршруты в

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

утверждение.

  • 1
    Да, это была та же проблема со мной тоже. Я создал домашний ( / ) маршрут вне web промежуточного ПО
3

У меня была аналогичная проблема, и я решил эту проблему, добавив маршруты в массив свойств промежуточного ПО,

НО

он работал только после вызова php artisan route:cache (очистка кэша маршрутов) впоследствии.

Я надеюсь, что некоторые из вас найдут это полезным.

  • 0
    Какие? Кэш должен быть очищен, чтобы промежуточное программное обеспечение работало хорошо.
  • 0
    Извините, я не знаю, о чем я там думал.
2

Также помните: если вы пишете тесты, а ваша переменная имеет $errors, убедитесь, что вы не используете черту Без магии.

  • 1
    Спасибо вам большое за это! Спас меня тонну хлопот
2

Перейдите в файл App\Http\Kernel.php. Переместите все свойства $middlewareGroups на $middleware.

Проверить дополнительную информацию - http://www.tisuchi.com/laravel-5-2-undefined-variable-error-validation/

2

Я тоже видел эту ошибку, и позже понял, что использовал признак WithoutMiddleware как средство обхода аутентификации для этого конкретного теста, но в итоге он также удалил привязку ошибок проверки. Поэтому мне пришлось прекратить использовать эту черту, чтобы сохранить взгляды.

  • 0
    Спасибо, это тоже была моя проблема. WithoutMiddleware ли вы решение для тестирования вещей, в которых есть и переменная ошибки, и для которой также необходимо приложение WithoutMiddleware ?
  • 1
    К сожалению, я не сделал. В своих тестах я просто создал пользователя и зарегистрировал его для каждого теста. К счастью, laravel делает это возможным с очень небольшим кодом, поэтому я не против.
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 route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [

    ],

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

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

сделайте ваше ядро ​​похожим на это

0

count не является реально выполнимым, так как предполагается, что переменная уже существует. измените проверку состояния на: @if($errors->has()) или просто @if($errors)

Также, если вы перенаправляете, обязательно используйте это в своем контроллере

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

EDIT: теперь вы видите, что используете L5.2 Это может ответить на ваш вопрос - вам нужно разместить свои маршруты в группе маршрутов.

Ошибки проверки Laravel 5.2

  • 0
    Ваши предложения также предполагают, что переменная существует ...
  • 0
    Нет, он проверяет наличие EDIT: если вы говорите о моем предложении контроллера, эта часть только в том случае, если, например, проверка не проходит.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню