Ошибки проверки 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());
}
Отображаются ошибки, но я не могу получить к ним доступ из шаблона.
Что не так?
Ответы
Ответ 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]'
));