web-dev-qa-db-fra.com

Laravel 5.2 $ erreurs n'apparaissant pas dans Blade

Donc, je suis le tutoriel sur Laravel 5 fondamentaux et je suis bloqué sur la validation du formulaire. J'ai suivi exactement le tutoriel, mais j'obtiens une variable indéfinie: des erreurs dans la vue de création d'articles.

Dans le tutoriel que je suis et ce que j’ai trouvé en ligne, ils disent que la variable d’erreurs est toujours présente dans le fichier blade à utiliser, donc je ne sais pas ce que je fais mal?

Toute aide serait appréciée! aimer Laravel sauf pour cette erreur!

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

Manette

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Http\Requests;
use App\Http\Requests\UserRequest as UserRequest;
// use App\Http\Requests\CreateArticleRequest as CreateArticleRequest;
use App\Http\Controllers\Controller;
use Illuminate\View\Middleware\ErrorBinder;

class UserController extends Controller
{
    public function create(){
      return view('pages.signUp');
    }

    public function store(UserRequest $request){
      User::create($request->all());
      return 'the user has been registered!';
      return view('user.profile');
    }

}

Demande de validation

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class UserRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email',
            'country' => 'required',
            'password' => 'required|min:6',
            'confirm_password' => 'required|same:password',
            'height' => 'required',
            'weight' => 'required',
        ];
    }
}
30
Neal Crowley

Il s’agit d’un problème majeur avec la mise à niveau 5.2. Ce qui se passe, c’est le middleware qui est responsable de rendre cette variable errors disponible pour toutes vos vues n’est pas utilisé car elle a été déplacée du middleware global au groupe de middleware web.

Il y a deux façons de résoudre ce problème: 

  1. Dans votre fichier kernel.php, vous pouvez déplacer le middleware \Illuminate\View\Middleware\ShareErrorsFromSession::class dans la propriété protected $middleware.

  2. Vous pouvez encapsuler tous vos itinéraires Web avec un groupe d’itinéraires et leur appliquer le middleware web.

    Route::group(['middleware' => 'web'], function() {
        // Place all your web routes here...
    });
    
39
user3158900

Résolu

Vous pouvez modifier l’un des éléments suivants:

1. Mettez votre route de travail (app/http/routes.php) sur

Route::group(['middleware' => ['web']], function () { // Here like Route::get('/', 'TodoController@index'); Route::post('/', 'TodoController@store'); });

Capture d'écran - 

 Screendshot 1

2. Déplacez votre protected $middlewareGroups web(app/Http/Kernel.php) sur protected $middleware = []

Capture d'écran -

 screenshot2

23

C'est la solution:

Changez la définition de vos groupes de routes avec un middleware, de:

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

à

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

Source: https://github.com/laravel/framework/issues/13000

18
Yuri

simplement, vous devez vous déplacer: 

\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,

de protected $middlewareGroups à protected $middleware

17
  1. Supprimez simplement , 'middleware' => 'web' de Route::group(array('prefix' => 'user', 'middleware' => 'web'), function() dansroutes.phppage OU

  2. Bouge toi 

    \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,

De protected $middlewareGroups à protected $middleware danskernel.phppage 

Comme le dit la documentation de Laravel: 

Remarque: Si votre copie de Laravel a un RouteServiceProvider qui possède déjà inclut le fichier de routes par défaut au sein du groupe de middleware Web, vous vous n'avez pas besoin d'ajouter manuellement le groupe à votre fichier routes.php.

Donc, supprimer du fichier routes.php serait la bonne façon.

6
Atiqur

À partir de la version 5.2, routes.php est déjà appelé par défaut dans le contexte d'un ['middleware'=>'web'] par RouteServiceProvider. Toutefois, dans la génération routes.php de routes d'authentification par défaut, l'appel Route::group est toujours actif par défaut. Si vous supprimez cette déclaration Route::group de routes.php, l'application affiche alors correctement les erreurs.

5
Dan Dart

Poster ceci comme cela pourrait être utile pour les autres, 

Comme Smartrahat mentionné dans la 1ère solution, dans votre fichier Kernel.php (app/Http/Kernel.php), déplacez \Illuminate\View\Middleware\ShareErrorsFromSession::class De $middlewareGroups vers la propriété protected $middleware, mais commence à générer l'erreur "Le magasin de session n'est pas défini sur demande" 

pour résoudre ce déplacement \Illuminate\Session\Middleware\StartSession::class, à $middleware property également.

5
Sambhav

Quelques observations sur cette question. Tout d’abord, il ya un bogue lié à ce problème dans githubPFA https://github.com/laravel/framework/issues/12022

Si vous regardez le dernier commentaire écrit par Graham, je pense que c'est le visage auquel je faisais face… .. Pour moi, même s'il y avait une erreur dans les données de publication du formulaire, j'obtenais l'égalité en dessous

boolval(count($errors) === 0) === true

Dans mon cas, j’ai ajouté des instructions de journal dans 

\Illuminate\Session\Middleware\StartSession::class

la classe middleware ci-dessus a été exécutée deux fois pour une requête donnée, je ne sais pas pourquoi elle a été exécutée deux fois, mais je pense que, pour cette raison, la variable $errors est réinitialisée . J'utilisais cette configuration (qui, à mon avis, est venue par défaut avec Laravel @ 5.2.43)

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

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

J'ai changé la configuration qui a fonctionné pour moi et le compte de la variable $errors n'est pas nul (le middleware ci-dessus n'a été exécuté qu'une seule fois par requête)

protected $middleware = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
    ],
];

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

Remarque: Toutes mes routes sont dans le groupe de middleware web avant et après le changement de configuration de Kernel.php, je n'ai absolument pas déplacé mes routes du groupe de middleware web.

4
agent47

Remplacez @foreach($errors->any() as $error) par @foreach($errors->all() as $error)

2
smartrahat

dans ce cas laravel 5.2 vous pouvez vous référer à un exemple de code et éditer votre fichier kernal.php. déplacez ce \Illuminate\View\Middleware\ShareErrorsFromSession::class, formulaire middlewareGroups vers middleware et ajoutez \Illuminate\Session\Middleware\StartSession::class, à middleware puis il fonctionnera correctement.

0
Madhuka Dilhan

Ayant à la fois les exigences Web et API dans notre application, nous ne voulions pas déplacer le middleware; peut-être que cela aurait fonctionné, cependant:

Nous avons eu la situation très particulière que les données de session flash[] et $errors ont été correctement transmises entre les méthodes de ressources laravel standard, store() et edit(), mais dans certains cas, les données n’ont pas été transmises par des méthodes presque identiques, storeSale() et editSale().

Nous avons constaté que dans nos environnements de développement et de déploiement, les pilotes de session "fichier" et "base de données" fonctionnaient dans tous les cas, contrairement au pilote "cookie".

Le passage au pilote de base de données dans toutes les instances a résolu le problème.

0
JDA3