Laravel Session Flash сохраняется для 2 запросов

Недавно я перешел на Laravel из Codeigniter, все шло отлично, но я столкнулся с проблемой Session::flash .

когда я создаю нового пользователя, я получаю сообщение об успешной работе, но он будет сохраняться для 2 запросов, даже если я не прошел проверку подлинности: введите описание изображения здесь

мой код в 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 

в master.blade :

 @if(Session::has('message')) <p class="alert {{ Session::get('alert-class', 'alert-info') }} alert-dismissable"> {{ Session::get('message') }}</p> @endif 

Может быть, я не одинок с этой проблемой, вот еще один вопрос без ответа.

Обновить

Для тех, кто в будущем сталкивается с этой проблемой: никогда не запустите данные сеанса без перенаправления.

Теперь мой код выглядит так:

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

Вы мигаете данные сеанса и создаете представление вместо перенаправления, то есть сообщение будет Flash для этого запроса, а для следующего – дважды.

Если вы хотите показать сообщение на текущем запросе без перенаправления, я бы предложил предоставить ошибки в View::make вместо того, чтобы пытаться выполнить Flash-сообщения. Если вы ДОЛЖНЫ выполнить Flash-сообщение в текущем запросе, вам понадобится Session::forget('key') или Session::flush() после вашего просмотра.

Как сказал @Drew ранее

Вы мигаете данные сеанса и создаете представление вместо перенаправления, то есть сообщение будет Flash для этого запроса, а для следующего – дважды.

Простой способ вывести сообщение один раз при создании представления:

 Session::flash($key, $value); Session::push('flash.old', $key); 

Счастливое кодирование!

У меня была аналогичная проблема, но я не мог использовать Return :: redirct, поскольку я использовал Ajax для отправки в и изнутри набора вкладок.

Поэтому я звонил

 Input::flashExcept('_token'); 

только если проверка не выполнена и возвращает представление со старым вводом. Предполагая, что проверка прошла, и я хотел запустить некоторые функции и создать новое представление на основе новых данных, я бы назвал:

 Session::forget('_old_input'); 

Я бы поставил это перед моим окончательным View::make

Надеюсь, это поможет (или имеет смысл) …

Следующее, по-видимому, доступно в версии 5.1. Хотя этот метод не упоминается на странице документации Laravel о сеансах .

 session()->now() 

Это то же самое, что и flash, за исключением того, что он не будет сохраняться в следующем запросе.

Хороший метод для повторного заполнения формы старыми данными:

контроллер:

 View::make( 'view.name' )->withOldFormData( Input::all() ); 

Посмотреть:

 {{ Form::model( $old_form_data ) }}