我在页面上有一个链接,我想阻止用户多次点击(或刷新路线),我需要使用PHP,特别是Laravel 4.2来防止这种情况。*
使用Laravel的内置会话处理Facade,在正在运行的路由的末尾,我向Session添加一个变量
Session::put('preventClick', true);
在方法开始时,我检查Session是否有项目,如果为false,我运行代码**
if (!Session::has('preventClick')) {
... CODE ...
}
不幸的是,这不起作用。检查Session::has('preventClick')
是否始终评估为false
。
使用PHP本机$_SESSION['preventClick']
完全按预期工作,那么Laravel的Session类为什么不这样做呢?我已尝试在Session::save()
之后明确调用Session::put(...)
来确认,但它仍然没有按预期运行。***
为了保持一致性,我宁愿将所有内容保留在Laravel框架中。
完整(简化)方法
public function placeOrder() {
if (!Session::has('preventClick') {
// ... Some code here ... //
Session::put('preventClick', true);
return $someValue;
}
}
* 注意:我知道单独使用PHP无法实现实际的点击防止,但我希望阻止代码运行。
** 注意:稍后在应用程序中,当我知道不再需要时,我将清除此Session变量。
*** 注意:Laravel Sessions在不同的页面请求/重定向之间以其他方式工作。
修改
我在另一个答案中找到了这个:https://stackoverflow.com/a/26165986/1694116
Laravel中的会话不会将更改视为永久更改,除非您生成响应(这是使用symphony作为其基础的结果)。因此,请确保您的app-> run()正确结束并在刷新之前返回响应。您的问题主要是由代码中某处的die()方法或PHP实例/ worker的意外退出引起的。
如果这是真的,这似乎是一个问题,因为我想阻止代码实际完成一个完整的请求......