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',
];
}
}
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:
Dans votre fichier kernel.php
, vous pouvez déplacer le middleware \Illuminate\View\Middleware\ShareErrorsFromSession::class
dans la propriété protected $middleware
.
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...
});
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 -
2. Déplacez votre protected $middlewareGroups web
(app/Http/Kernel.php)
sur protected $middleware = []
Capture d'écran -
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 () {
simplement, vous devez vous déplacer:
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
de protected $middlewareGroups
à protected $middleware
Supprimez simplement , 'middleware' => 'web'
de Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()
dansroutes.phppage OU
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.
À 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.
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.
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
.
Remplacez @foreach($errors->any() as $error)
par @foreach($errors->all() as $error)
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.
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.