【问题标题】:Laravel: How to mark Session data as flashedLaravel:如何将会话数据标记为闪烁
【发布时间】:2017-11-06 22:54:41
【问题描述】:

我正在尝试在表单上预填充输入,以便在 Laravel 5.4 中创建模型实体。但是表单是一个共享刀片模板,具有相同模型的编辑表单,我想使用表单模型绑定来提供输入。

到目前为止,我实现这一点的方法是将会话变量闪存到控制器中的_old_input 以用于创建路由: session()->flash('_old_input.description', $event->description);

这正是我想要的,除了在请求结束时没有被清除。我的下一个请求仍然刷新了会话数据。

我的问题是 Laravel 怎么知道这是一条消息的接收者,而不是一条消息的输入?有没有办法告诉它我已经使用了会话闪存并且应该在这个请求结束时清理它......

【问题讨论】:

    标签: laravel session


    【解决方案1】:

    您需要使用重定向来刷新会话...否则,您最终会在下一个请求时保持闪烁...

    你可以返回一个视图......就像

    return redirect('view')->with('_old_input.description', $event->description);
    

    或者你甚至可以重定向到一个控制器动作……比如

    session()->flash('_old_input.description', $event->description);
    return redirect()->action('MyController@function');
    

    这也可以...关键是返回重定向响应...

    希望这会有所帮助...

    【讨论】:

    • 我知道我可以使用它,但这肯定意味着我需要一个额外的路由和控制器来处理提供默认值;我认为经过进一步检查,您可以将会话密钥从 flash_varsnew 行移动到 old,这意味着它已被此请求清除
    • 重定向到编辑路径?除非您想自己管理它,但这会产生一组不同的问题... Flash 为下一个请求设置会话...如果在当前请求中您创建了一个 ok 响应,则该会话将具有此设置...那么当下一个会话到来时,它将被设置和清除...如果您从此请求重定向,您将创建另一个请求/响应周期,因此只能在客户端中看到它一次...无论哪种方式,您都必须管理一些东西...我发现重定向更清晰且富有表现力...
    • 但是编辑路径需要我有一个模型才能传入,在这种情况下我无法创建一个模型,因为某些必需的属性还不知道。
    【解决方案2】:

    Serge 是正确的,闪存旨在用于将数据放入 NEXT 请求的会话中,因此重定向是执行此操作的正确方法,我还将在此处提供我用来破解此方法的解决方案。 .

    Laravel 将其 flash 数据存储在会话数组中的 _flash 值中,在 new 键下的 NEXT 请求中使用的键,以及在 old 中的 THIS 请求中使用的键钥匙;请参阅下面的摘录。

    [_flash] => Array
        (
            [old] => Array
                (
                )
    
            [new] => Array
                (
                    [0] => _old_input
                )
        )
    

    使用session()->push('_flash.old', '_old_input'); 使 Laravel 误以为这是从前一个请求中闪入到此请求中的数据,并在其周期结束时清除数据。

    要获得完整效果,您可以使用 session()->forget('_flash.new.0'); 将其从新密钥中删除,但请注意,这不一定是第一个闪烁的 var(在我的情况下是)。

    因此,我的总代码是:

    session()->flash('_old_input', ['description' => $event->description]);
    session()->push('_flash.old', '_old_input');
    session()->forget('_flash.new.0');
    

    同样,Serge 是正确的,但如果有人来这里了解 Laravel 的闪烁是如何工作的并想绕过它,这里有一些信息

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 1970-01-01
      • 2019-10-19
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多