Laravel 5.2 erreurs de validation

J'ai quelques problèmes avec la validation dans Laravel 5.2 Quand j'essaie de valider une requête dans un controller comme celui-ci

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

Validator erreur de capture, mais ne les stocke pas à la session, donc quand je suis essayer d'appeler dans le modèle ce code

 @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 suis 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');
            }

Variable $ error également non disponible dans le modèle mais si j'essaie d'Afficher des erreurs dans controller

   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
demandé sur Marcin Nabiałek 2015-12-22 19:44:17

9 réponses

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 d'envelopper vos routes autour du groupe middleware web parce qu'il le fait pour vous dans le fichier RouteServiceProvider. Toutefois, si vous utilisez une version de Laravel entre 5.2.0 et 5.2.26, puis reportez-vous à la méthode ci-dessous:

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 soupçonne.

la façon dont fonctionnent les middlewares est passée de 5.2 et 5.1. En 5.1, vous le verrez 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 est la pile globale HTTP middleware de votre application. En d'autres termes, ils s'exécutent sur chaque demande. Prenez une note à cet 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 web et une API dans la même application. Maintenant, vous verrez ceci dans ce 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 mondiale de middleware ne vérifie désormais que la maintenance. Vous avez maintenant un middleware groupe appelé "web" qui inclut une grande partie de l'ancien middleware global. Rappelez-vous que c'est comme ceci que de permettre à la fois une interface utilisateur web et une API dans la même application.

comment récupérer la variable $errors ?

dans votre fichier routes, vous devez ajouter vos routes dans le groupe middleware" web "pour avoir accès à cette variable $errors sur chaque demande. Comme ceci:

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

Si vous n'allez pas construire une API, une autre option consiste à déplacer les middlewares "web" vers la pile middleware globale comme en 5.1.

49
répondu Thomas Kim 2016-03-29 16:06:21

essayer d'utiliser

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors
4
répondu Gowtham Selvaraj 2016-05-30 22:38:34

essayer de remplacer:

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

avec:

->withErrors($validator);
3
répondu Marcin Nabiałek 2015-12-22 17:07:40
// Replace

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

// with 

Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
});
2
répondu Alex 2016-05-30 19:10:25

j'ai mon code de validation de travail dans laravel 5.2 comme ceci

tout d'abord créer une fonction dans le modèle comme ceci

dans le modèle ajouter cette ligne de code au début

utilisation Éclairer\Support\Façades\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

utilisation Éclairer\Support\Façades\Rediriger;

  $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 les choses que vous devez écrire votre itinéraire comme ceci

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

    Route::resource('RouteURL', 'ControllerName');
});
0
répondu Bindesh Pandya 2016-05-05 09:43:31

vous Envelopper Routes web middleware comme ci-dessous:

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

et dans app\Http\Kernel.php déplacer \Illuminate\Session\Middleware\StartSession::class du web $middlewareGroups au $middleware espérons qu'il permettra de résoudre votre problème.

0
répondu Bashar 2016-05-17 04:07:24

//Ce sera le travail

   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
répondu 2016-06-14 10:16:01
// 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

trouver le documentation .

0
répondu Eazy Sam 2018-03-16 06:22:11
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
répondu Raheem 2018-09-27 12:00:04