我在CakePHP中找到的一个简洁的功能是能够设置flash
消息,比如在一些save
脚本上,然后在下一页显示该消息。类似于Post updated
或Error - no file found.
Cake执行此操作的方式是使用此session
对象。我试图避免像瘟疫这样的会议,因为他们对可扩展性的要求很高。我是否可以简单地将Flash消息存储在cookie(客户端)中,然后在下一页显示后删除该cookie?这种方法的优点/缺点是什么 - 或者更简单地说,为什么Cake使用session
(我假设它与_SESSION
集合相关)。
干杯!
P.S。在我的实现中,我还使用javascript中的setTimeout
命令淡出。我发现这是结束整个过程的好方法。
答案 0 :(得分:4)
我不明白为什么你不能使用一个过期时间为创建日期10分钟的cookie。如果用户离开并在11分钟后返回,则可能无法看到闪存cookie消息......但您不必担心会使用cookie充斥客户端。
只需制作一些简单的内容规则,以确保没有特权信息放入Flash消息中,您应该做得很好。
一个简单的实现可能是程序性的:
function setFlash($id ,$message){
setcookie("flash_{$id}", $message, time() + 60 * 10);
}
function getFlashes(){
$flashes = array();
foreach($_COOKIE as $id => $value){
if(strpos($id, "flash_") === 0){
$flashes[$id] = $value;
//clear flash and set expiration to 10 minutes in past
setcookie($id, "", time() * 60 * -10);
}
}
return $flashes;
//Input cleansing not included for brevity/clarity
}
或者,如果闪存源自客户端,则可以使用https://github.com/marcuswestin/store.js之类的东西来尝试使用localSession存储来管理闪存消息。
答案 1 :(得分:4)
Cookie的问题在于用户可能会禁用此功能。如果是这样,您的Flash消息将不会显示。 CakePHP尝试足够通用并使用会话存储。
您有3个选项:
在我的应用程序中,我使用了第二种和第三种方法的组合:我测试了cookie,如果它们可用,我会使用它们。如果没有,我使用数据库访问,但我总是缓存数据库访问,以便不为每条消息多次查询。
答案 2 :(得分:0)
另一个想法是通过url中的哈希传输消息:
if (isset($_POST['submit'])) {
...
header("Location: ".$_SERVER["REQUEST_URI"]."#".urlencode($msg));
...
}
优点:
缺点:
答案 3 :(得分:0)
不幸的是,会话后跟Header(“ Location ...”);并不总是可靠的
我正在考虑按照建议将其放入GET request或Hash标签,并且可以使用window.history.pushState从URL使用javascript将其擦除在下一页。
编辑:除非session_write_closed();使用。