【问题标题】:Laravel flash message stays on page for more than one requestLaravel flash 消息在多个请求中停留在页面上
【发布时间】:2016-06-19 15:23:24
【问题描述】:

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

这是我在控制器中添加发布操作:

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

这是闪存文件:

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

【问题讨论】:

  • 你试过redirect('admin/dashboard')-&gt;with('post_success', 'post success')吗?
  • 让我看看我是否理解:您提交了一篇新博客文章,然后收到一条带有指向新创建文章的链接的甜蜜警报成功消息,您单击链接并查看该文章,现在您尝试点击后退按钮转到创建帖子页面,您仍然会收到相同的成功警报?
  • 问题可能出在您的视野中 - 您能否说明如何在模板中显示警报?
  • 看看这个让你的生活更美好的包。github.com/digitlimit/alert
  • 没错,我更新了帖子以显示 Flash 文件

标签: php laravel laravel-5 laravel-5.2


【解决方案1】:

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

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

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

可能的解决方案:

  1. 从用户的角度来看,这不是最优雅的,但可能是您最容易实现的:您可以 包括一个链接,如“返回仪表板”或类似内容,用于 用户单击哪个将他发送回仪表板 一种从头开始重新加载页面的方式,而不是使用 后退按钮。

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

  3. 在这种情况下,另一种选择是实际告诉您的浏览器 停止缓存数据。

有几种方法可以实现第三个选项:

如果您包含以下内容:

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。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2021-05-28
    • 2022-10-20
    • 2016-02-15
    • 1970-01-01
    相关资源
    最近更新 更多