Laravel Session Flash 持续存在 2 个请求

Posted

技术标签:

【中文标题】Laravel Session Flash 持续存在 2 个请求【英文标题】:Laravel Session Flash persists for 2 requests 【发布时间】:2014-08-26 02:31:06 【问题描述】:

最近我从 Codeigniter 改为 Laravel,一切都很好,只是遇到了 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());

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

【问题讨论】:

【参考方案1】:

检查您的 Api 的会话 put 和 session get Api 的范围必须在同一范围内(即 web.php 或 api.php)。

【讨论】:

【参考方案2】:

创建:

$request->session()->flash('status', 'Task was successful!');

删除:

$request->session()->forget('status');

【讨论】:

【参考方案3】:

从 5.1 版开始,以下内容似乎可用。虽然Laravel's documentation page about sessions 上没有提到该方法。

session()->now()

这和 flash 一样,只是它不会持续到下一个请求。

【讨论】:

holyfk,为什么在任何文档中都没有提到这个?!!!!!!谢谢 我读到了某人的推理(在接受的答案中可能是德鲁),如果你有东西只能传递一次,你应该把它作为一个视图参数。我想这就是为什么它有点气馁。我们希望它不会在未来的版本中被删除。【参考方案4】:

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

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

【讨论】:

感谢您的澄清,您的回答后我已经解决了问题。 我无法收到闪信。让我知道确切的问题。 @Drew: Session::flush('key') 不是一个有效的函数调用,flush() 不接受任何参数,而是删除所有会话数据,你能更新你的答案吗? Session::forget('key') 可以用来删除任何会话数据,我建议:)【参考方案5】:

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

控制器:

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

查看:

 Form::model( $old_form_data ) 

【讨论】:

这个答案如何适用于这个问题? 这是解决问题的另一种方法。他可以使用这种安全方法填充表单,而不是重定向到新路线!【参考方案6】:

正如@Drew 之前所说的

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

在创建视图时显示一次消息的简单方法是:

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

编码愉快!

【讨论】:

对于其他像我一样对此感到困惑的人,如果您像这样闪烁:Flash::warning('warning text'); 那么您要跟进的是Session::push('flash.old', 'flash_notification.message');Session::push('flash.old', 'flash_notification.level');。这将使其仅在第一页加载时显示。如果需要,您可以dd($request-&gt;session()); 查看会话如何存储这些值。【参考方案7】:

我遇到了类似的问题,但我无法使用 Return::redirct,因为我使用 Ajax 在一组选项卡中发布和发布。

所以,我在打电话

Input::flashExcept('_token'); 

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

Session::forget('_old_input');  

我会把它放在我最后的View::make

之前

希望这会有所帮助(或有意义)...

【讨论】:

以上是关于Laravel Session Flash 持续存在 2 个请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中,在 session 中传递不同类型的 flash 消息的最佳方式

Laravel 5.2 session flash 在本地主机上工作但在服务器上不工作?

PHP笔记-laravel框架记录session中flash()的一次应用

PHP笔记-laravel框架记录session中flash()的一次应用

如何在 laravel 5.5 中使用 Noty 包

如何在laravel中ajax成功后显示flash消息?