Когда я хочу зарегистрировать пользователя в моем проекте 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
.
Почему это? Раньше у меня не было этой проблемы.
Кто-нибудь может мне помочь?
Вы должны убедиться, что в 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
, вы можете получить очень неожиданные результаты.
У меня была такая же проблема с Laravel 5.2.x.
Внутри файла routes.php
попробуйте создать маршруты в
Route::group(['middleware' => ['web']], function () {
//routes here
}
утверждение.
/
) маршрут вне web
промежуточного ПО
У меня была аналогичная проблема, и я решил эту проблему, добавив маршруты в массив свойств промежуточного ПО,
НО
он работал только после вызова php artisan route:cache
(очистка кэша маршрутов) впоследствии.
Я надеюсь, что некоторые из вас найдут это полезным.
Также помните: если вы пишете тесты, а ваша переменная имеет $errors, убедитесь, что вы не используете черту Без магии.
Перейдите в файл App\Http\Kernel.php. Переместите все свойства $middlewareGroups
на $middleware
.
Проверить дополнительную информацию - http://www.tisuchi.com/laravel-5-2-undefined-variable-error-validation/
Я тоже видел эту ошибку, и позже понял, что использовал признак WithoutMiddleware
как средство обхода аутентификации для этого конкретного теста, но в итоге он также удалил привязку ошибок проверки. Поэтому мне пришлось прекратить использовать эту черту, чтобы сохранить взгляды.
WithoutMiddleware
ли вы решение для тестирования вещей, в которых есть и переменная ошибки, и для которой также необходимо приложение WithoutMiddleware
?
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.
сделайте ваше ядро похожим на это
count не является реально выполнимым, так как предполагается, что переменная уже существует. измените проверку состояния на: @if($errors->has())
или просто @if($errors)
Также, если вы перенаправляете, обязательно используйте это в своем контроллере
return redirect()->back()->with('errors', $validator->messages());
EDIT: теперь вы видите, что используете L5.2 Это может ответить на ваш вопрос - вам нужно разместить свои маршруты в группе маршрутов.
composer.lock
, какую версию он тянет?