Laravel Session Flash持续2个请求

时间:2014-07-04 18:51:24

标签: php session laravel laravel-4

最近我从Codeigniter换了Laravel,一切都很顺利,除了我遇到Session::flash的问题。

当我创建新用户时,我会收到成功消息,但它会持续2个请求,即使我没有通过验证器: enter image description here

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

也许我并不孤单,here是另一个未解决的问题。

更新

对于将来遇到此问题的任何人: 永不闪回会话数据而不重定向。

我的代码现在看起来像这样:

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

7 个答案:

答案 0 :(得分:20)

您正在闪烁会话数据并创建视图而不是重定向,这意味着该消息将针对此请求闪烁,并为下一个请求显示两次。

如果您想在不重定向的情况下在当前请求中显示消息,我建议您向View::make提供错误,而不是尝试Flash消息。如果您必须在当前请求中闪烁消息,那么您需要在查看后Session::forget('key')Session::flush()

答案 1 :(得分:5)

正如@Drew先前说的那样

  

您正在闪烁会话数据并创建视图而不是   重定向,意味着该消息将闪烁此请求和   下一个,显示两次。

创建视图时,一种简单的方法是闪烁消息:

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

快乐的编码!

答案 2 :(得分:5)

以下似乎可以从5.1版本开始提供。虽然Laravel's documentation page about sessions上提到的方法

session()->now()

这与flash相同,但它不会持续到下一个请求。

答案 3 :(得分:1)

我遇到了类似的问题,但是我无法使用Return :: redirct,因为我使用Ajax来发布和发布一组Tabs。

因此,我正在打电话

Input::flashExcept('_token'); 

仅当验证失败并返回具有旧输入的视图时。假设验证通过,我想运行一些函数并根据新数据创建一个新视图,我会调用:

Session::forget('_old_input');  

我会在最终View::make

之前提出这个问题

希望这有助于(或有意义)......

答案 4 :(得分:0)

创建:
$ request-> session()-> flash('status','任务成功!');

删除:
$ request-> session()-> forget('status');

答案 5 :(得分:0)

检查你的 Api 的 session put 和 session get 的范围,Api 必须在相同的范围内(即 web.php 或 api.php)。

答案 6 :(得分:-2)

使用旧数据重新填充表单的好方法:

控制器:

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

查看:

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