Недавно я перешел на 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 ) }}