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

Когда я хочу зарегистрировать пользователя в моем проекте 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.

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

Может кто-то помочь мне, пожалуйста?


person Anhinga    schedule 24.12.2015    source источник
comment
Какая версия Laravel? Конкретно в вашем composer.lock файле какую версию тянет?   -  person Jeremy Harris    schedule 24.12.2015
comment
Интересно. Я еще не испортил 5.2, но я ясно вижу в документации, о чем вы говорите. Может быть ошибка в 5.2? laravel.com/docs/5.2/validation   -  person Jeremy Harris    schedule 24.12.2015
comment
Да, в Laravel 5.2 есть ошибка. У многих людей такая же проблема с Laravel 5.2.   -  person smartrahat    schedule 24.12.2015
comment
проверьте этот вопрос: stackoverflow.com/ questions / 34420590 /   -  person shock_gone_wild    schedule 25.12.2015


Ответы (10)


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

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

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

person Marcin Nabiałek    schedule 24.12.2015
comment
Он уже там ... Скопировал весь блок, чтобы убедиться, но он по-прежнему не работает - person Anhinga; 24.12.2015
comment
Вы обновляли приложение из более ранней версии Laravel или запускаете новое приложение с нуля в Laravel 5.2? - person Marcin Nabiałek; 24.12.2015
comment
Начал с нуля через scotchbox - person Anhinga; 24.12.2015
comment
Не могли бы вы подробнее объяснить первый вариант? Или где мне это делать? Я использовал ваш второй вариант ('\ lighting \ ... :: class', в '$ middleware'). Это решает ошибку, но теперь выдает новую ошибку: ›Хранилище сеансов не установлено по запросу. Или что мне делать, чтобы исправить это? Уже большое спасибо! - person Anhinga; 26.12.2015
comment
@Anhinga Хорошо, так что вы должны добавить в $middleware и других из группы web - EncryptCookies , AddQueuedCookiesToResponse , StartSession and VerifyCsrfToken (в той же нотации, что и в файле Kernel, я поставил ссылку). На данный момент у вас не запущен сеанс, поэтому вы получаете эту ошибку - person Marcin Nabiałek; 26.12.2015
comment
Отлично, это работает! Спасибо! Теперь проблема в том, что я могу сделать только 1 вызов БД ... Мне нужно перезапускать свой sotchbox каждый раз, когда я звоню ... Я могу проверять страницу phpmyadmin только при перезапуске scotchbox и могу только войти в систему или зарегистрировать 1 пользователя . После этого laravel больше не находит БД. (Также php мой администратор выдает ошибку 404 после 1 вызова) - person Anhinga; 26.12.2015

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

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

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

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

person Felipe Peña    schedule 28.12.2015
comment
Да, у меня была такая же проблема. Я создал домашний (/) маршрут вне промежуточного программного обеспечения web - person gthuo; 07.01.2016

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

person Krzysztof Boduch    schedule 19.05.2016

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

НО

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

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

person Tom11    schedule 20.02.2016
comment
Какие? Для нормальной работы промежуточного программного обеспечения необходимо очистить кеш. - person Tom11; 01.03.2017
comment
Извините, я не знаю, о чем я там думал. - person xdhmoore; 06.03.2017

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

person Nikush    schedule 02.01.2016
comment
Спасибо, это тоже была моя проблема. Вы нашли решение для тестирования материала, в котором есть как переменная ошибки, так и WithoutMiddleware? - person Fanmade; 04.01.2016
comment
@Fanmade К сожалению, я этого не сделал. В своих тестах я просто создавал пользователя и входил в систему для каждого теста. К счастью, laravel делает это возможным с очень небольшим количеством кода, поэтому я не против. - person Nikush; 06.01.2016

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

Проверьте дополнительные сведения: http://www.tisuchi.com/laravel-5-2-undefined-variable-error-validation/

person tisuchi    schedule 23.03.2016

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

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

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

РЕДАКТИРОВАТЬ: теперь видно, что вы используете L5.2. Это может ответить на ваш вопрос - вам нужно поместить свои маршруты в группу маршрутов.

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

person Vojko    schedule 24.12.2015
comment
Нет, он проверяет наличие EDIT: если вы говорите о моем предложении контроллера, эта часть только в том случае, если, например, проверка не удалась. - person Vojko; 25.12.2015
comment
не совсем ... где это проверяет на существование? $ errors- ›имеет ()? предполагает, что существует переменная $ errors - person shock_gone_wild; 25.12.2015
comment
Если я не ошибаюсь, метод has () является логическим, поэтому он вернет 0 или 1, как если бы вы это сделали if ($ errors) - person Vojko; 25.12.2015
comment
Чтобы быть более понятным. Count необходимо проверить внутри переменной $ errors, чтобы узнать, сколько элементов находится в массиве. Метод has () возвращает только true или false без проверки переменной. Следовательно, вот почему это метод. Я использую свою обработку ошибок в laravel, подобную этой, начиная с L4, и она работает без единой проблемы, как и на моем L5.1 - person Vojko; 25.12.2015
comment
Я думаю, вы что-то неправильно поняли ... $ errors- ›has () означает, что функция с именем $ has () вызывается для $ errors. Если $ errors не существует (или имеет значение null или не определяет функцию has ()), это завершится ошибкой. Попробуйте это с помощью $ notexistant- ›has (). это не удастся. - person shock_gone_wild; 25.12.2015
comment
В Laravel всегда есть ошибки $. Вопрос в том, массив это или пустая переменная. - person Vojko; 25.12.2015
comment
Неважно - теперь увидел, что вопрос был о L5.2 - это проблема промежуточного программного обеспечения. - person Vojko; 25.12.2015

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.

сделайте так, чтобы ваше ядро ​​выглядело так

person Amit Rai    schedule 31.03.2016

Ваша проблема будет решена с помощью этого метода.

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

Если это вам не поможет, просто запустите следующую команду artisan в дополнение к приведенному выше коду:

php artisan key:generate

Я так решил при использовании 5.2. *

person Asadullah Al Galib    schedule 15.09.2018

На самом деле это не было ошибкой, это было предупреждение, которое вы можете удалить с помощью функции php error_reporting()

Я удалил предупреждение в своем Laravel 5.6, используя

error_reporting(E_ALL ^ E_NOTICE);

Подробнее: http://php.net/manual/en/function.error-reporting.php

Надеюсь, это поможет.

person Brijesh Hadiyal    schedule 13.07.2018