Recently I have changed to Laravel from Codeigniter, everything was going fine except I encountered a problem with Session::flash
.
when I create new user I get success message but It will persist for 2 requests, even I didn't pass the validator:
my code in 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()); }
in 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
in master.blade
:
@if(Session::has('message')) <p class="alert {{ Session::get('alert-class', 'alert-info') }} alert-dismissable"> {{ Session::get('message') }}</p> @endif
Maybe I'm not alone with this issue, here is another unanswered question.
Update
For anyone in future facing this problem: Never flash session data without redirecting.
My code now looks like this:
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'); }