Laravel 5.2 errori di convalida

Ho qualche problema con la validazione in Laravel 5.2 Quando provo a convalidare la richiesta in controller come questo

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

Errore di convalida del Validator, ma non memorizzarlo in sessione, quindi quando provo a chiamare questo modello con questo codice

  @if (isset($errors) && count($errors) > 0) 
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif

Laravel lancia l’errore

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

Quando cerco di provare con questo codice

  $validator = Validator::make($request->all(), [ 'title' => 'required', 'content.*.rate' => 'required' ]); if ($validator->fails()) { return redirect() ->back() ->withInput($request->all()) ->withErrors($validator, 'error'); } 

Errore $ variabile anche non disponibile nel modello, ma se provo a visualizzare errori nel controller

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

    Gli errori vengono visualizzati ma non riesco ad accedervi dal modello.

    Cosa c’è che non va?

    Aggiornamento a partire da Laravel 5.2.27

    Laravel ora supporta il middleware web per impostazione predefinita, come puoi vedere qui: source

    In altre parole, non è più necessario avvolgere i percorsi attorno al gruppo middleware Web perché lo fa per te nel file RouteServiceProvider. Tuttavia, se si utilizza una versione di Laravel tra 5.2.0 e 5.2.26, fare riferimento al metodo seguente:

    Di seguito si applica solo a Laravel dalla 5.2.0 alla 5.2.26

    Senza vedere il tuo file routes.php o Kernel.php , ecco quello che sospetto stia accadendo.

    Il modo in cui il lavoro del middleware è cambiato da 5.2 a 5.1. In 5.1, lo vedrai nella tua 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, ]; 

    Questo array rappresenta lo stack middleware HTTP globale dell’applicazione. In altre parole, corrono su ogni richiesta. Prendi nota di questo particolare middleware: Illuminate\View\Middleware\ShareErrorsFromSession . Questo è ciò che aggiunge la variabile $errors su ogni richiesta.

    Tuttavia, in 5.2, le cose sono cambiate per consentire sia un’interfaccia utente Web sia un’API all’interno della stessa applicazione. Ora, lo vedrai nello stesso file:

     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', ], ]; 

    Lo stack middleware globale ora controlla solo la manutenzione. Ora hai un gruppo di middleware chiamato “web” che include una parte del middleware globale precedente. Ricorda che è così che consente sia un’interfaccia utente Web sia un’API all’interno della stessa applicazione.

    Quindi, come possiamo recuperare la variabile $errors ?

    Nel tuo file di rotte, devi aggiungere le rotte all’interno del gruppo middleware “web” per poter accedere a quella variabile $errors su ogni richiesta. Come questo:

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

    Se non hai intenzione di build un’API, un’altra opzione è spostare i middleware “web” nello stack middleware globale come in 5.1.

    Prova a usare

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

    Prova a sostituire:

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

    con:

     ->withErrors($validator); 
     // Replace Route::group(['middleware' => ['web']], function () { // Add your routes here }); // with Route::group(['middlewareGroups' => ['web']], function () { // Add your routes here }); 

    Ho il mio codice di validazione di lavoro in laravel 5.2 come questo

    prima di tutto creare una funzione in un modello come questo

    Nel modello aggiungi questa riga di codice all’avvio

    usa Illuminate \ Support \ Facades \ Validator;

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

    e nel controller chiama questa funzione per convalidare l’input

    usa Illuminate \ Support \ Facades \ Redirect;

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

    Ora ecco che arriva la parte del modello

     @if (count($errors) > 0) 
      @foreach ($errors->all() as $error)
    • {{ $error }}
    • @endforeach
    @endif

    e Sopra ogni cosa devi scrivere la tua Route in questo modo

     Route::group(['middleware' => ['web']], function () { Route::resource('RouteURL', 'ControllerName'); }); 

    Avvolgi i tuoi percorsi nel middleware web come di seguito:

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

    e In app\Http\Kernel.php move \Illuminate\Session\Middleware\StartSession::class dal $middlewareGroups al $middleware spero che risolva il tuo problema.

    // Funzionerà

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

    // e anche questo funziona

     Route::post('location',array( 'as'=>'location', 'middlewareGroups'=>'web', 'uses'=>'[email protected]' )); 
     // Controller $this->validateWith([ 'title' => 'required', 'content.*.rate' => 'required', ]); // Blade Template @if ($errors->has('title'))  {{ $errors->first('title') }}  @endif @if ($errors->has('anotherfied'))  {{ $errors->first('anotherfied') }}  @endif 

    Trova la documentazione .