Подтвердить что ты не робот

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

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

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

мой код в UsersController:

function getCreateUser(){
    $config = array(
        'pageName' => 'createUser',
        'pageTitle' => 'Create User',
        'formUrl'   => action('[email protected]'),
        '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('[email protected]'),
        '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

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

Update

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

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

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('[email protected]');
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

session()->now()

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

Ответ 4

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

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

Input::flashExcept('_token'); 

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

Session::forget('_old_input');  

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

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

Ответ 5

Создайте:
$request-> session() → flash ("статус", "задача выполнена успешно!");

удалять:
$request-> сессия() → забыть ( 'статус');

Ответ 6

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

Контроллер:

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

Вид:

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