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

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');
}
14
demandé sur Community 2014-07-04 22:51:24

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.

18
répondu Drew 2016-02-03 16:39:53

@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!

4
répondu TechyTimo 2015-07-31 10:22:56

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.

3
répondu aross 2017-11-15 16:11:40

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

1
répondu Neil Telford 2015-02-01 20:32:40

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 ) }}
-1
répondu AMIB 2015-12-07 22:40:43