Подтвердить что ты не робот

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

У меня есть некоторые проблемы с проверкой в ​​Laravel 5.2 Когда я пытаюсь проверить запрос в контроллере, как это

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);

Ошибка проверки валидатора, но не храните их в сеансе, поэтому, когда я пытаюсь вызвать в шаблоне этот код

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

Laravel выдает ошибку

Undefined variable: errors (View: /home/vagrant/Code/os.dev/resources/views/semantic/index.blade.php)

Когда я пытаюсь проверить с помощью этого кода

 $validator = Validator::make($request->all(), [
                'title' => 'required',
                'content.*.rate' => 'required'
            ]);

            if ($validator->fails()) {
                return redirect()
                    ->back()
                    ->withInput($request->all())
                    ->withErrors($validator, 'error');
            }

Переменная $error также недоступна в шаблоне, но если я пытаюсь отображать ошибки в контроллере

   if ($validator->fails()) {
                dd($validator->errors()->all());
            }

Отображаются ошибки, но я не могу получить к ним доступ из шаблона.

Что не так?

4b9b3361

Ответ 1

Обновление от Laravel 5.2.27

Laravel теперь поддерживает сетевое промежуточное ПО по умолчанию, как вы можете здесь: источник

Другими словами, вам больше не нужно обматывать маршруты вокруг группы промежуточного программного обеспечения, потому что это делает это для вас в файле RouteServiceProvider. Однако, если вы используете версию Laravel между 5.2.0 и 5.2.26, обратитесь к следующему методу:

Ниже применимо только к Laravel 5.2.0 до 5.2.26

Не видя ваш файл routes.php или Kernel.php, я подозреваю, что это происходит.

Режим работы middlewares изменился с 5.2 и 5.1. В 5.1 вы увидите это в своем файле app/Http/Kernel.php:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \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,
];

Этот массив является вашим глобальным стеком промежуточного программного обеспечения HTTP. Другими словами, они запускаются в каждом запросе. Обратите внимание на это промежуточное ПО: Illuminate\View\Middleware\ShareErrorsFromSession. Это то, что добавляет переменную $errors для каждого запроса.

Однако в 5.2 все изменилось, чтобы использовать как веб-интерфейс, так и API в одном приложении. Теперь вы увидите это в том же файле:

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

Глобальный стек промежуточного программного обеспечения теперь проверяет только на обслуживание. Теперь у вас есть промежуточная группа, называемая "веб", которая включает в себя большую часть предыдущего глобального промежуточного программного обеспечения. Помните, что это так, чтобы разрешить как веб-интерфейс, так и API в одном приложении.

Итак, как мы можем вернуть эту переменную $errors?

В вашем файле маршрутов вам нужно добавить свои маршруты в группу "промежуточного программного обеспечения" для доступа к этой переменной $errors для каждого запроса. Вот так:

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

Если вы не собираетесь создавать API, другой вариант - переместить "веб-посредники" в глобальный стек промежуточного программного обеспечения, как в 5.1.

Ответ 2

Попробуйте использовать

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors

Ответ 3

Попробуйте заменить:

->withErrors($validator, 'error');

с:

->withErrors($validator);

Ответ 4

// Replace

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

// with 

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

Ответ 5

У меня есть мой код проверки работоспособности в laravel 5.2, подобный этому

сначала создайте функцию в модели, подобную этой

В модели добавьте эту строку кода при запуске

использовать Illuminate\Support\Facades\Validator;

public static function validate($input) {

            $rules = array(
                'title' => 'required',
                'content.*.rate' => 'required',
              );
            return Validator::make($input, $rules);
        }

и в контроллере вызовите эту функцию для проверки ввода

использовать Illuminate\Support\Facades\Redirect;

  $validate = ModelName::validate($inputs);
    if ($validate->passes()) {
          ///some code
     }else{
           return Redirect::to('Route/URL')
                            ->withErrors($validate)
                            ->withInput();
      }

Теперь вот часть шаблона

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

и, прежде всего, вы должны написать свой маршрут таким образом

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

    Route::resource('RouteURL', 'ControllerName');
});

Ответ 6

Оберните свои маршруты в web промежуточное ПО, как показано ниже:

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

и In app\Http\Kernel.php переместите \Illuminate\Session\Middleware\StartSession::class из web $middlewareGroups в $middleware надеюсь, что это решит вашу проблему.

Ответ 7

//Это будет работать

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

// Add your routes here
});

//а также работает

Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'[email protected]'
));