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?
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.
Essayez d'utiliser
return redirect()->back()
->withInput($request->all())
->withErrors($validator->errors()); // will return only the errors
Essayez de remplacer:
->withErrors($validator, 'error');
avec:
->withErrors($validator);
// Replace
Route::group(['middleware' => ['web']], function () {
// Add your routes here
});
// with
Route::group(['middlewareGroups' => ['web']], function () {
// Add your routes here
});
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
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
$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
Route::group(['middleware' => ['web']], function () {
Route::resource('RouteURL', 'ControllerName');
});
// ç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'
));
// 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 .
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
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.