Le Flash de la Session Laravel persiste pour 2 requêtes
récemment J'ai changé pour Laravel de Codeigniter, tout allait bien sauf que j'ai rencontré un problème avec Session::flash
.
quand je crée un nouvel utilisateur je reçois le message de succès mais il va persister pour 2 requêtes, même si je n'ai pas passé le validateur:
mon code UsersController
:
function getCreateUser(){
$config = array(
'pageName' => 'createUser',
'pageTitle' => 'Create User',
'formUrl' => action('UsersController@postCreateUser'),
'modelFields' => array(
array('db_name' => 'employee_id', 'text' => 'Employee Id', 'mandatory' => TRUE),
array('db_name' => 'full_name', 'text' => 'Full Name', 'mandatory' => TRUE),
array('db_name' => 'email', 'text' => 'Email', 'mandatory' => FALSE),
array('db_name' => 'password', 'text' => 'Password','value' => '12345', 'mandatory' => TRUE)
),
'submit_text' => 'Create'
);
return View::make('layouts.form', $config);
}
function postCreateUser(){
$config = array(
'pageName' => 'createUser',
'pageTitle' => 'Create User',
'formUrl' => action('UsersController@postCreateUser'),
'modelFields' => array(
array('db_name' => 'employee_id', 'text' => 'Employee Id', 'mandatory' => TRUE),
array('db_name' => 'full_name', 'text' => 'Full Name', 'mandatory' => TRUE),
array('db_name' => 'email', 'text' => 'Email', 'mandatory' => FALSE),
array('db_name' => 'password', 'text' => 'Password','value' => '12345', 'mandatory' => TRUE)
),
'submit_text' => 'Create'
);
$validator = User::validate(Input::all());
if($validator->passes()){
$user = new User(Input::all());
$user->password = Hash::make(Input::get('password'));
$user->Company_id = '1';
$user->save();
Session::flash('message', 'User Created Successfully!');
Session::flash('alert-class', 'alert-success');
return View::make('layouts.form', $config);
}
return View::make('layouts.form', $config)->withErrors($validator->messages());
}
form.blade
:
@if ( $errors->count() > 0 )
<div class="alert alert-danger">
<p>The following errors have occurred:</p>
<ul>
@foreach( $errors->all() as $message )
<li>{{ $message }}</li>
@endforeach
</ul>
</div>
@endif
master.blade
:
@if(Session::has('message'))
<p class="alert {{ Session::get('alert-class', 'alert-info') }} alert-dismissable"> {{ Session::get('message') }}</p>
@endif
Peut-être que je ne suis pas le seul avec ce problème, ici est une autre question sans réponse.
mise à Jour
pour toute personne confrontée à ce problème à l'avenir: Jamais de flash les données de session sans redirection.
Mon code ressemble maintenant à ceci:
function postCreateUser(){
$validator = User::validate(Input::all());
if($validator->passes()){
$user = new User(Input::all());
$user->password = Hash::make(Input::get('password'));
$user->Company_id = '1';
$user->save();
Session::flash('message', 'User Created Successfully!');
Session::flash('alert-class', 'alert-success');
} else {
Session::flash('message', Helpers::formatErrors($validator->messages()->all()));
Session::flash('alert-class', 'alert-danger');
}
return Redirect::action('UsersController@getCreateUser');
}
5 réponses
vous clignotez des données de session et créez une vue au lieu de rediriger, ce qui signifie que le message clignotera pour cette requête et pour la suivante, montrant deux fois.
si vous voulez afficher le message sur la requête courante sans rediriger, je vous suggère de fournir les erreurs à votre View::make
au lieu d'essayer D'afficher les messages. Si vous devez afficher le message sur la requête courante, alors vous aurez besoin de Session::forget('key')
ou Session::flush()
après votre point de vue.
@Drew dit plus haut
Vous clignotez des données de session et la création d'une vue au lieu de redirection, ce qui signifie que le message clignotera pour cette requête et pour le suivant, montrant deux fois.
une façon facile d'afficher un message Une fois que vous créez une vue est:
Session::flash($key, $value);
Session::push('flash.old', $key);
bon codage!
ce qui suit semble être disponible à partir de la version 5.1. Bien que la méthode est mentionné sur la page de documentation de Laravel sur les sessions.
session()->now()
c'est la même chose que flash, sauf qu'il ne va pas persister à la requête suivante.
j'ai eu un problème similaire, mais je ne pouvais pas utiliser Return::redirct, car J'utilisais Ajax to pour poster vers et depuis un ensemble d'onglets.
Donc, j'en appelle
Input::flashExcept('_token');
seulement si la validation échoue et renvoie une vue avec l'ancienne entrée. En supposant que la validation soit passée et que je veuille exécuter certaines fonctions et créer une nouvelle vue basée sur de nouvelles données, j'appellerais:
Session::forget('_old_input');
je mettrais ce avant ma finale View::make
J'espère que cela aidera (ou logique)...
une bonne méthode pour repeupler la forme avec de vieilles données:
Contrôleur:
View::make( 'view.name' )->withOldFormData( Input::all() );
Vue:
{{ Form::model( $old_form_data ) }}