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?
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.
essayer d'utiliser
return redirect()->back()
->withInput($request->all())
->withErrors($validator->errors()); // will return only the errors
essayer 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 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');
});
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.
// 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 .
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