web-dev-qa-db-fra.com

Laravel Session Flash persiste pour 2 demandes

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: enter image description here

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.

Mettre à jour

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');
}
15
Walid Ammar

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.

19
Drew

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!

5
TechyTimo

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.

5
aross

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) ...

1
Neil Telford