Errores de validación de Laravel 5.2
laravel-validation laravel-5.2 (8)
// Esto funcionará
Route::group([''middlewareGroups'' => [''web'']], function () {
// Add your routes here
});
// así como esto también funciona
Route::post(''location'',array(
''as''=>''location'',
''middlewareGroups''=>''web'',
''uses''=>''myController@function''
));
Tengo algunos problemas con la validación en Laravel 5.2 Cuando intento validar la solicitud en un controlador como este
$this->validate($request, [
''title'' => ''required'',
''content.*.rate'' => ''required'',
]);
El Validator detecta un error, pero no los almacena en la sesión, así que cuando intento llamar a la plantilla, este código
@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 arroja el error
Undefined variable: errors (View: /home/vagrant/Code/os.dev/resources/views/semantic/index.blade.php)
Cuando intento probar validar con este código
$validator = Validator::make($request->all(), [
''title'' => ''required'',
''content.*.rate'' => ''required''
]);
if ($validator->fails()) {
return redirect()
->back()
->withInput($request->all())
->withErrors($validator, ''error'');
}
La variable $ error tampoco está disponible en la plantilla, pero si intento mostrar errores en el controlador
if ($validator->fails()) {
dd($validator->errors()->all());
}
Se muestran errores, pero no puedo acceder a ellos desde la plantilla.
¿Qué pasa?
Envuelva sus rutas en middleware web
como a continuación:
Route::group([''middleware'' => [''web'']], function () { // Add your routes here });
y en la app/Http/Kernel.php
move /Illuminate/Session/Middleware/StartSession::class
de la web
$middlewareGroups
a $middleware
espero que resuelva su problema.
Intenta reemplazar:
->withErrors($validator, ''error'');
con:
->withErrors($validator);
Intenta usar
return redirect()->back()
->withInput($request->all())
->withErrors($validator->errors()); // will return only the errors
Tengo mi código de validación de trabajo en laravel 5.2 como este
antes que nada crear una función en un modelo como este
En el modelo, agregue esta línea de código al comenzar
use Illuminate / Support / Facades / Validator;
public static function validate($input) {
$rules = array(
''title'' => ''required'',
''content.*.rate'' => ''required'',
);
return Validator::make($input, $rules);
}
y en el controlador llama a esta función para validar la entrada
use Illuminate / Support / Facades / Redirect;
$validate = ModelName::validate($inputs);
if ($validate->passes()) {
///some code
}else{
return Redirect::to(''Route/URL'')
->withErrors($validate)
->withInput();
}
Ahora aquí viene la parte de la plantilla
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
y sobre todas las cosas debes escribir tu ruta así
Route::group([''middleware'' => [''web'']], function () {
Route::resource(''RouteURL'', ''ControllerName'');
});
Actualización a partir de Laravel 5.2.27
Laravel ahora es compatible con el middleware web de forma predeterminada, como puede ver aquí: source
En otras palabras, ya no es necesario que envuelva sus rutas en el grupo de middleware web porque lo hace por usted en el archivo RouteServiceProvider. Sin embargo, si está utilizando una versión de Laravel entre 5.2.0 y 5.2.26, consulte el siguiente método:
A continuación solo se aplica a Laravel 5.2.0 a 5.2.26
Sin ver su archivo routes.php
o Kernel.php
, esto es lo que sospecho que está sucediendo.
La forma en que los middlewares funcionan ha cambiado de 5.2 y 5.1. En 5.1, verá esto en su archivo de la 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,
];
Esta matriz es la pila de middleware HTTP global de su aplicación. En otras palabras, se ejecutan en cada solicitud. Tome una nota en este middleware en particular: Illuminate/View/Middleware/ShareErrorsFromSession
. Esto es lo que agrega la variable $errors
en cada solicitud.
Sin embargo, en 5.2, las cosas han cambiado para permitir tanto una interfaz de usuario web como una API dentro de la misma aplicación. Ahora, verá esto en el mismo archivo:
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'',
],
];
La pila de middleware global ahora solo busca mantenimiento. Ahora tiene un grupo de middleware llamado "web" que incluye una gran parte del middleware global anterior. Recuerde que es así para permitir tanto una interfaz de usuario web como una API dentro de la misma aplicación.
Entonces, ¿cómo recuperamos esa variable de $errors
?
En su archivo de rutas, necesita agregar sus rutas dentro del grupo de middleware "web" para que tenga acceso a esa variable de $errors
en cada solicitud. Me gusta esto:
Route::group([''middleware'' => [''web'']], function () {
// Add your routes here
});
Si no va a construir una API, otra opción es mover los middlewares "web" a la pila de middleware global como en 5.1.
// Controller
$this->validateWith([
''title'' => ''required'',
''content.*.rate'' => ''required'',
]);
// Blade Template
@if ($errors->has(''title''))
<span class="error">
<strong>{{ $errors->first(''title'') }}</strong>
</span>
@endif
@if ($errors->has(''anotherfied''))
<span class="error">
<strong>{{ $errors->first(''anotherfied'') }}</strong>
</span>
@endif
Encuentra la documentation .
// Replace
Route::group([''middleware'' => [''web'']], function () {
// Add your routes here
});
// with
Route::group([''middlewareGroups'' => [''web'']], function () {
// Add your routes here
});