Laravel使用会话将数据从控制器传递到视图

时间:2017-09-16 16:51:12

标签: php laravel session model-view-controller

不知何故,我只是使用

来管理它(将数据,数组从控制器传递到视图)
return redirect('whatever')->with('arrayName', $arrayName);

在视图中通过

访问它
    @if(!is_null(session('arrayName')))
        <div class="alert alert-{{ session('arrayName')['something'] }} alert-dismissable">
        // more code goes here          
    @endif

现在这似乎是一个会话,我正在使用这种技术以信息的形式传递数据(例如成功创建XY,删除,等等)(使用相同的消息)数组的名称),现在又一次发生信息显示在不应该的页面上(因为上面的HTML在每个HTML /刀片页面内部,以便始终有机会显示消息/警报),因为它仍然存储在会话中。因此,不仅显示旧消息,它甚至是我在应用程序内部的其他位置使用的消息。

我想知道session()调用是否是错误,或者我是否需要刷新会话(如果是,如何以及何时?)或者我是否只是搞砸了控制器和视图之间的通信,因为我已经看到(同样here)人们在视图中访问它时使用唯一的变量名,而不是session()。那么,这可能是一个旧的Laravel版本(我使用的是最新版本)当它只在那时工作或我错过了什么?

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

我猜测您遇到问题的数据是您使用session()->put('key', 'value)session(['key' => 'value'])手动存储在会话中的数据。当您将put()数据加入会话时,它会一直保留到会话过期或手动忘记。

但是,如果您只希望数据保留一个响应并在此之后立即删除,则可以使用flash()方法。这就是redirect()->with()功能的工作原理。您在with()中指定的数据会“闪现”到会话中,因此它只会持续一个响应。

因此,您可以将代码更改为“闪存”数据,只需一个响应时,或者您需要更新刀片模板,以便在显示数据后手动forget()数据:

@if(!is_null(session('arrayName')))
    <div class="alert alert-{{ session('arrayName')['something'] }} alert-dismissable">

    // more code goes here

    @php
        session()->forget('arrayName')
    @endphp
@endif