Récemment, j'ai changé pour Laravel de Codeigniter, tout se passait bien sauf un problème avec Session::flash
.
lorsque je crée un nouvel utilisateur, le message de réussite s'affiche, mais il persiste pendant 2 demandes, même si je n'ai pas réussi le validateur:
mon code dans 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());
}
dans 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
dans 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 seul avec ce problème, ici est une autre question sans réponse.
Pour tous ceux qui, à l'avenir, sont confrontés à ce problème: Ne jamais mettre à jour les données de session sans rediriger.
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');
}
Vous faites clignoter des données de session et créez une vue au lieu de rediriger, ce qui signifie que le message clignotera pour cette demande et pour la suivante, en s'affichant deux fois.
Si vous souhaitez afficher le message sur la demande actuelle sans rediriger, je vous suggère de fournir les erreurs à votre View::make
au lieu d'essayer de flasher les messages. Si vous DEVEZ Flash le message sur la demande en cours, vous devrez alors Session::forget('key')
ou Session::flush()
après votre affichage.
Comme @Drew a dit plus tôt
Vous faites clignoter les données de session et créez une vue au lieu de Rediriger, ce qui signifie que le message clignotera pour cette demande et pour La suivante, en s'affichant deux fois.
Un moyen facile de faire clignoter un message une fois lorsque vous créez une vue est le suivant:
Session::flash($key, $value);
Session::Push('flash.old', $key);
Bonne codage!
Ce qui suit semble être disponible à partir de la version 5.1. Bien que la méthode soit not mentionné sur la page de documentation de Laravel sur les sessions .
session()->now()
C'est la même chose que flash, sauf que cela ne persistera pas jusqu'à la prochaine requête.
J'avais un problème similaire, mais je ne pouvais pas utiliser Return :: redirct, car j'utilisais Ajax pour envoyer des messages à partir d'un ensemble d'onglets.
Donc j'appelais
Input::flashExcept('_token');
uniquement si la validation échoue et renvoie une vue avec l'ancienne entrée. En supposant que la validation soit réussie et que je souhaite 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 ceci avant mon View::make
final
J'espère que cela aide (ou a du sens) ...