防止在调用setInterval()时清除laravel会话

时间:2019-12-21 21:05:29

标签: laravel

我有一个javascript函数,每隔1秒钟就会重新加载页面,但是每当我尝试在其他页面上重新加载页面时。

return redirect()->back()->with('success','anything');

如果我在刀片文件中以

的形式收到它
{{$success}} 

成功数据为null,因为javascript setInterval()每1秒在所有页面上运行一次,已重置laravel会话。如果对setInterval方法进行了注释,则它可以正常工作。我该如何解决。

1 个答案:

答案 0 :(得分:1)

之所以会这样,是因为back()方法返回的301代码为response,这是重定向HTTP代码... with()方法并非没有用,因为它将在脚本结束后销毁。
换句话说,在返回之前将with方法作为PHP声明进行映像,就像这样

$success = 'anything';
return ...;

例如,如果您要返回一个视图,则此更改将如下所示(假设该视图为something {{$success}} something):

$success = 'anything';
$your_view = "something". e($success) ."something";
return $your_view;

这将返回200代码和该字符串作为内容,但是返回301正文,因此redirect()->back()的正文将被忽略,因为它是重定向代码,并且紧跟在return redirect()->back()之后所有变量都将被销毁,$success元素也将被销毁。 按时间顺序,事情将按此顺序发生

  1. JS发送请求
  2. PHP脚本已被触发
  3. 已创建$success变量并将其分配给'anything'
  4. 被触发redirect()->back()方法,并传递给它$success
  5. Laravel构建301响应,而未使用$success
  6. 该脚本返回301响应,因此该脚本的所有变量都被销毁(取消分配),包括$success
  7. 浏览器收到301,因此它将请求发送到301响应内的地址
  8. PHP被解雇了
  9. Laravel对该响应做了什么,但要注意$success在这里不存在,因为它是另一个脚本的一部分,因此在此目前它不存在更多
    因此,您必须找到一种在两个不同的时刻运行的与sam SESSION关联的两个脚本之间移动信息的方法...以及如果不使用Session的话还有其他方法吗?
    实际上,Laravel附带了许多可用于管理会话的方法,包括Session::flash(key, value),它将在下一个脚本结束后销毁值,因此在脚本结束时Laravel会在之后触发重定向。

所以您要做的是,首先刷新会话中的数据

use Session;
...

Session::flash('success','anything');
return redirect()->back();

然后在您要重新加载方面的视图中,如果会话中有与您正在使用的键相关联的内容,则添加消息,然后使用'success'键:

@if(session()->has('success'))
     {{session()->get('success')}}
@endif

就是这样