laravel laravel-validation laravel-5.2

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 });