web-dev-qa-db-fra.com

Erreurs de validation Laravel 5.2

J'ai quelques problèmes avec la validation dans Laravel 5.2 Quand j'essaye de valider la demande dans le contrôleur comme ceci

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

Validator catch error, mais ne les stockez pas dans la session, donc quand j'essaie d'appeler ce code dans un template

 @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 jeter l'erreur

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

Quand je vais essayer de valider avec ce code 

 $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 n’est pas non plus disponible dans le modèle mais si j’essaie d’afficher les erreurs dans le contrôleur

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

Les erreurs s'affichent mais je ne peux pas y accéder depuis le modèle.

Qu'est-ce qui ne va pas?

21
Dmitry

Mise à jour à partir de Laravel 5.2.27

Laravel supporte maintenant le middleware Web par défaut, comme vous pouvez le voir ici: source

En d'autres termes, vous n'avez plus besoin de regrouper vos itinéraires dans le groupe de middleware Web, car il le fait pour vous dans le fichier RouteServiceProvider. Toutefois, si vous utilisez une version de Laravel comprise entre 5.2.0 et 5.2.26, reportez-vous à la méthode ci-dessous:

Le tableau ci-dessous s'applique uniquement à Laravel 5.2.0 à 5.2.26

Sans voir votre fichier routes.php ou Kernel.php, voici ce que je suspecte de se produire.

La façon dont les middlewares fonctionnent a été modifiée de 5.2 à 5.1. En 5.1, vous verrez ceci dans votre fichier 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,
];

Ce tableau correspond à la pile de middleware HTTP global de votre application. En d'autres termes, ils s'exécutent à la demande every. Prenez note sur ce middleware particulier: Illuminate\View\Middleware\ShareErrorsFromSession. C'est ce qui ajoute la variable $errors à chaque requête.

Cependant, en 5.2, les choses ont changé pour permettre à la fois une interface utilisateur Web et une API dans la même application. Maintenant, vous verrez ceci dans le même fichier:

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 pile de middleware global ne vérifie plus que la maintenance. Vous avez maintenant un groupe de middleware appelé "web" qui inclut une grande partie du middleware global précédent. Rappelez-vous que c’est comme cela que vous autorisez une interface utilisateur Web et une API dans la même application.

Alors, comment récupérons-nous cette variable $errors?

Dans votre fichier de routes, vous devez ajouter vos routes dans le groupe de middleware "Web" pour que vous ayez accès à cette variable $errors à chaque requête. Comme ça:

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

Si vous n'allez pas créer une API, une autre option consiste à déplacer les middlewares "Web" vers la pile de middleware globale, comme dans la version 5.1.

49
Thomas Kim

Essayez d'utiliser 

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

Essayez de remplacer:

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

avec:

->withErrors($validator);
3
Marcin Nabiałek
// Replace

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

// with 

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

J'ai mon code de validation de travail dans laravel 5.2 comme celui-ci

tout d'abord créer une fonction dans un modèle comme celui-ci

Dans le modèle, ajoutez cette ligne de code au début

utilisez Illuminate\Support\Facades\Validator;

public static function validate($input) {

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

et dans le contrôleur appeler cette fonction pour valider l'entrée

utilisez Illuminate\Support\Facades\Redirect;

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

Maintenant, voici la partie modèle

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

et surtout, vous devez écrire votre itinéraire comme ceci

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

    Route::resource('RouteURL', 'ControllerName');
});
0
Bindesh Pandya

// ça va marcher

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

// Add your routes here
});

// ainsi que cela fonctionne aussi

Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'myController@function'
));
0
user6463929
// 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

Trouvez la documentation .

0
Eazy Sam
Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
    Route::resource('/post', 'PostController');
});


public function store(Request $request){
   $this->validate($request, [
       //input field names
      'title' => 'required|max:20',
      'body' => 'required',
   ]);
}

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

Enveloppez-vous des routes dans le middleware web comme ci-dessous:

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

et Dans app\Http\Kernel.php, déplacez \Illuminate\Session\Middleware\StartSession::class de web$middlewareGroups vers $middleware espérons que cela résoudra votre problème.

0
Bashar