Laravel flash消息在页面上停留多个请求

时间:2016-03-05 22:22:05

标签: php laravel laravel-5 laravel-5.2

好的,所以我目前正在建立一个博客,在我的添加帖子页面(仪表板)我用Javascript sweetalert闪烁一条消息并且工作正常,但我在其中包含一个链接查看您刚写的帖子。当您单击它,然后按后退按钮时,将再次显示Flash消息。然后再次。再一次永远。

这是我在控制器中的添加帖子操作:

public function createBlogPost(Post $post, Request $request)
{
    $post = new Post;

    $post->title = $request->title;
    $post->slug = str_slug($post->title, '-');
    $post->thumbnail = $request->thumbnail;
    $post->content = $request->content;
    $post->save();

    $mostrecent = DB::table('posts')->orderBy('created_at', 'desc')->first();
    $mslug = $mostrecent->slug;
    $request->session()->put('mslug', $mslug);

    Session::flash('post_success', 'post success');
    return redirect('admin/dashboard');
    // I have tried Session::forget('post_success');
    //              Session::pull('post_success');
    //              Session::flush();
}

我真的不知道问题是什么,但我很确定它必须与重定向有关,因为我可以在重定向之前忘记密钥并且消息不会闪烁。

非常感谢任何帮助

(忽略糟糕的PHP,我对这些东西还很陌生:P)

编辑: 我将flash.blade.php包含在我的主文件底部:

@include('templates.flash')

这是flash文件:

@if (Session::has('post_success'))
<script>
    swal({
      title: 'Post created!',
      html:
        '<p>Check it out ' +
        '<a href="/blog/{{ Session::get('mslug') }}">here</a>.',
      type: 'success'
    })
</script>
@endif

编辑2:我的路线

Route::get('admin/dashboard', [
    'as' => 'dashboard',
    'uses' => 'AdminController@dashboard'
]);

Route::post('admin/dashboard', [
    'as' => 'createblogpost',
    'uses' => 'AdminController@createBlogPost'
]);

1 个答案:

答案 0 :(得分:1)

首先要解释一下你的问题,你应该看看here,但你的问题的基本要点与Laravel无关。

当您在浏览器中按后退按钮时,浏览器本身会尽力将您带回到您所在的页面,它会尝试通过缓存一些数据来帮助您,这样您就可以返回到确切的位置你离开了,这通常意味着如果你填写表格,当你按下后退按钮时,表格仍会为你填写。

因此,在您的情况下,使用Laravel的Session::flash只会将消息保留为一个请求,但这并不一定意味着您的浏览器赢了&#39 ; t缓存数据本身。因此,当您点击后退按钮时,您的浏览器会向您闪回成功消息。

可能的解决方案:

  1. 从用户角度来看,这不是最优雅的,但可能最容易实现:你可以 包括链接,例如&#39;返回信息中心&#39;或类似的东西,因为 用户点击将他送回仪表板的用户 页面将从头开始重新加载而不是使用的方式 后退按钮。

  2. 您可以更改方法并使用 Ajax 加载Flash 消息而不是会话。这样当你按下后退按钮时 页面将被重新加载,但不会调用Ajax 而且你不会看到flash消息。这将允许使用 后退按钮,但会强制您在代码中再做一些工作。

  3. 在这种情况下的另一种选择,虽然它需要一些研究和测试,并且只有在你确定它不会产生负面副作用时才应该使用,那就是实际告诉你的< strong>浏览器停止缓存数据。

  4. 有几种方法可以做第三种选择:

    如果您包含以下内容:

    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: private, no-store, max-age=0, no-cache, must-revalidate, post-check=0, pre-check=0");
    header("Pragma: no-cache");
    

    在您的控制器中,或者作为新的中间件ClearBrowserCache或类似的东西,那么您可以通过PHP实现这一点,这是理想的,因为它可以很好地与Laravel集成,您不必担心关于没有启用JavaScript的用户。唯一的问题是,它在Chrome中运行时,它现在只在Safari 9上运行。

    类似的替代方案是使用Javascript来实现相同的目标,方法是将此脚本添加到您的页面中:

    window.onpageshow = function(evt) {
        if (evt.persisted) {
            document.body.style.display = "none";
            location.reload();
        }
    };
    

    此脚本适用于Safari,但它对Chrome无效。

    因此,如果您选择最后一个选项来查看哪些有效并在您认为需要支持的任何浏览器中进行测试,并找到解决方案或解决方案组合,那么您真的需要做更多的研究适用于不同的浏览器。