Laravel 5.2 $ошибки не отображаются в Blade

Итак, я следую учебнику по основам Laravel 5, и я застрял на проверке формы. Я точно следовал руководству, но получаю неопределенную переменную: ошибки в представлении создания статей.

В учебнике, которому я следую, и в том, что я нашел в Интернете, говорится, что переменная ошибок всегда находится в файле лезвия, чтобы вы могли ее использовать, поэтому я не знаю, что я делаю неправильно?

Любая помощь будет оценена по достоинству! любить Laravel, кроме этой ошибки!

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

Контроллер

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Http\Requests;
use App\Http\Requests\UserRequest as UserRequest;
// use App\Http\Requests\CreateArticleRequest as CreateArticleRequest;
use App\Http\Controllers\Controller;
use Illuminate\View\Middleware\ErrorBinder;

class UserController extends Controller
{
    public function create(){
      return view('pages.signUp');
    }

    public function store(UserRequest $request){
      User::create($request->all());
      return 'the user has been registered!';
      return view('user.profile');
    }

}

Запросить подтверждение

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class UserRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email',
            'country' => 'required',
            'password' => 'required|min:6',
            'confirm_password' => 'required|same:password',
            'height' => 'required',
            'weight' => 'required',
        ];
    }
}

person Neal Crowley    schedule 23.12.2015    source источник
comment
Покажите валидацию.   -  person user2094178    schedule 23.12.2015
comment
Нил, пожалуйста, опубликуйте свой контроллер, который вызывает это представление, и вашу логику проверки. Людям будет намного проще вам помочь :)   -  person Mark Davidson    schedule 23.12.2015


Ответы (11)


Это критическая проблема с обновлением 5.2. Происходит то, что промежуточное программное обеспечение, которое отвечает за то, чтобы сделать эту переменную errors доступной для всех ваших представлений, не используется, потому что оно было перемещено из глобального промежуточного программного обеспечения в группу промежуточного программного обеспечения web.

Есть два способа исправить это:

  1. В файле kernel.php вы можете переместить промежуточное ПО \Illuminate\View\Middleware\ShareErrorsFromSession::class обратно в свойство protected $middleware.

  2. Вы можете обернуть все свои веб-маршруты группой маршрутов и применить к ним промежуточное ПО web.

    Route::group(['middleware' => 'web'], function() {
        // Place all your web routes here...
    });
    
person user1669496    schedule 23.12.2015
comment
Это доводит меня до конца. Большое вам спасибо! Это сводит меня с ума со вчерашнего дня! теперь я вижу, что появляется тег ошибки UL ... но сообщения об ошибках на самом деле не заполняются? Я пошел с вариантом маршрута, который вы предложили - person Neal Crowley; 23.12.2015
comment
И теперь это полностью исправлено! поместите все мои маршруты, требующие проверки, в группу маршрутов, которую вы предложили, и foreach, на мой взгляд, нуждается в $errors->all() Большое вам спасибо! - person Neal Crowley; 23.12.2015
comment
Что вам нужно было сделать, чтобы переменная ошибок заполнилась, чтобы я мог изменить ответ? - person user1669496; 23.12.2015
comment
Я следую учебнику среднего уровня и имею эту проблему со ВСЕМИ маршруты авторизации. Инструкции на этой странице неверны (или, возможно, не завершены). Лучшее решение проблемы — № 2 выше. - person Kryten; 11.01.2016
comment
Route::auth() на самом деле по умолчанию вызывается в Route::group(['middleware' => 'web']... так что это просто предлагает использовать значение по умолчанию... что на самом деле, похоже, не хочет помочь..? - person Dan Dart; 28.03.2016
comment
Спасибо за этот пост. Вариант 2 я уже делал, но решил сделать наоборот и вынести свой маршрут из промежуточного ПО, и тогда заработало. Я решил последовать приведенному ниже совету и внести необходимые изменения в файл Kernel.php. - person Richard Chassereau; 05.05.2016

Решено

Вы можете изменить любой из следующих параметров:

<сильный>1. включить рабочий маршрут (app/http/routes.php)

Route::group(['middleware' => ['web']], function () { // Here like Route::get('/', 'TodoController@index'); Route::post('/', 'TodoController@store'); });

Снимок экрана -

Скриншот 1

<сильный>2. Переместите protected $middlewareGroups web (app/Http/Kernel.php) на protected $middleware = []

Снимок экрана -

screenshot2< /а>

person Md. Khairullah Nayan    schedule 20.01.2016
comment
Спасибо. Это сработало для меня. Почему промежуточные группы не нужны для проверки в ядре по умолчанию? - person Richard Chassereau; 05.05.2016
comment
Это работает для меня. Кстати, мне не понравился вариант перемещения группы промежуточного программного обеспечения в глобальную, но я хотел добавить два промежуточных программного обеспечения для URL-адреса администратора. сеть и админ. Как говорится, сеть автоматически добавляется routeserviceprovider, поэтому, если я добавлю только администратора, тогда не потребуется никакого другого промежуточного программного обеспечения, назначенного для сети, поэтому я должен указать обе опции, такие как Route::group(['middleware' => ['web', 'admin'], 'prefix' => 'admin'], function () { ... и это не работает, поскольку сеть включена два раза. Команда Laravel должна исправить это как можно скорее; - person Chetan Patel; 14.06.2016
comment
мило, вот что мы называем ответом :) - person vimuth; 10.10.2016
comment
Великолепно.......... это работает идеально для меня..... вы экономите мое время - person Nitin Vaghani; 06.02.2017

Это решение:

Измените определение групп маршрутов с помощью промежуточного ПО, из :

Route::group(['middleware' => 'web'], function () {

to

Route::group(['middlewareGroups' => 'web'], function () {

Источник: https://github.com/laravel/framework/issues/13000

person Yuri    schedule 12.07.2016
comment
Ничто из вышеперечисленного не помогло мне (кроме изменения файла Kernel.php, но мне не нравятся эти решения для многих вещей), но это решение решает мою проблему. У меня много вложенных Route:group в моем файле route.php, и я тоже использую Route:resource - person herohat; 19.07.2016
comment
Здесь и сейчас в 2017 году это решение этой проблемы. Большое спасибо @Yuri - person Kenshinman; 13.04.2017

просто, вы должны двигаться:

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

с protected $middlewareGroups по protected $middleware

person Mohamed Radhi Guennichi    schedule 30.03.2016

  1. Просто удалите , 'middleware' => 'web' из Route::group(array('prefix' => 'user', 'middleware' => 'web'), function() на странице routes.php ИЛИ

  2. Переехать

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

От protected $middlewareGroups до protected $middleware на странице kernel.php

Как говорится в документации Laravel:

Примечание. Если в вашей копии Laravel есть RouteServiceProvider, который уже включает файл маршрутов по умолчанию в группу веб-промежуточного программного обеспечения, вам не нужно вручную добавлять группу в файл route.php.

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

person Atiqur    schedule 05.05.2016

Публикация этого, поскольку это может быть полезно для других,

Как Smartrahat упоминал в 1-м решении, в вашем Kernel.php файле (app/Http/Kernel.php) переместите \Illuminate\View\Middleware\ShareErrorsFromSession::class из свойства $middlewareGroups в protected $middleware, но то же самое начнет выдавать ошибку «Хранилище сеансов не установлено по запросу»,

чтобы решить эту проблему, переместите \Illuminate\Session\Middleware\StartSession::class, в $middleware property.

person Sambhav Pandey    schedule 09.02.2016

Начиная с 5.2, routes.php по умолчанию уже вызывается в контексте ['middleware'=>'web'] по RouteServiceProvider. Но при генерации маршрутов аутентификации по умолчанию routes.php вызов Route::group по-прежнему происходит по умолчанию, поэтому, если вы удалите это объявление Route::group из routes.php, приложение будет правильно отображать ошибки.

person Dan Dart    schedule 27.03.2016
comment
Похоже, вы правы, и это объясняет: github.com/laravel/framework/issues/ 12022 - person Jean-Philippe Murray; 29.03.2016
comment
Теперь это было исправлено в последних проверках. Промежуточное программное обеспечение исчезло с маршрутов, и все снова работает. - person Dan Dart; 19.05.2016

Пара замечаний по этому вопросу. Во-первых, в github есть связанная ошибка, связанная с этой проблемой PFA https://github.com/laravel/framework/issues/12022

Если вы посмотрите на последний комментарий, который написал Грэм, я думаю, что это то лицо, с которым я столкнулся. Для меня, несмотря на то, что в данных формы сообщения была ошибка, я получал равенство ниже

boolval(count($errors) === 0) === true

В моем случае я добавил операторы журнала в

\Illuminate\Session\Middleware\StartSession::class

вышеприведенный класс промежуточного программного обеспечения запускался дважды для данного запроса, я не уверен, почему он запускался дважды, но я думаю, что из-за этого переменная $errors сбрасывается. Я использовал эту конфигурацию (которая, я думаю, была установлена ​​по умолчанию с [email protected])

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',
    ],
];

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

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

protected $middleware = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

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

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

Примечание. Все мои маршруты находятся в группе промежуточного программного обеспечения web до и после изменения конфигурации Kernel.php, я вообще не перемещал свои маршруты из группы промежуточного программного обеспечения web.

person agent47    schedule 12.09.2016

Изменить @foreach($errors->any() as $error) на @foreach($errors->all() as $error)

person smartrahat    schedule 23.12.2015
comment
Все еще получаю ту же ошибку Неопределенная переменная: ошибки И теперь я следую документам в отношении проверки формы, указанной здесь: laravel.com/docs/5.2/validation - person Neal Crowley; 23.12.2015

в этом случае laravel 5.2 вы можете обратиться к примеру кода и отредактировать файл kernal.php. переместите этот \Illuminate\View\Middleware\ShareErrorsFromSession::class, сформируйте middlewareGroups в middleware и добавьте \Illuminate\Session\Middleware\StartSession::class в middleware, тогда все будет работать правильно.

person Madhuka Dilhan    schedule 17.02.2016

Имея в нашем приложении требования как к Web, так и к API, мы не хотели перемещать промежуточное ПО; возможно, однако, это сработало бы:

У нас была очень необычная ситуация, когда данные сеанса flash[] и $errors передавались правильно между стандартными методами ресурсов laravel, store() и edit(), но в некоторых случаях данные не возвращались через почти идентичные методы, storeSale() и editSale().

Мы обнаружили, что в наших средах разработки и развертывания драйверы сеансов «файл» и «база данных» работали во всех случаях, а драйвер «куки» — нет.

Переключение на драйвер базы данных во всех экземплярах решило проблему.

person JDA3    schedule 06.07.2016