php - 如何在我的自定义 MVC 框架中设置 Flash 消息?
问题描述
这是 Session.php 文件中的 Session 类
<?php
namespace app\core;
class Session
{
public function __construct()
{
session_start();
}
public function setFlash($key='', $message='')
{
$_SESSION['flash'][$key] = $message;
}
public function getFlash($key='')
{
return $_SESSION['flash'][$key] ?? false;
}
public function __destruct()
{
unset($_SESSION['flash']);
}
}
然后我在注册后将用户重定向到主页之前调用了 session::setFlash() 并在视图中调用 session::getFlash() 或布局无关紧要,但我什么也没显示
这是代码
public function register(Request $request)
{
$registerModel = new RegisterModel;
if($request->isPost())
{
$registerModel->loadData($request->getBody());
if($registerModel->validate() && $registerModel->save())
{
Application::$app->session->setFlash('success', 'Thanks for registering');
$this->redirect('.');
}
return $this->render('register', [
'model' => $registerModel
]);
}
$this->setLayout('auth');
return $this->render('register', [
'model' => $registerModel
]);
}
这是视图
<div class="container">
<?php if(Application::$app->session->getFlash('success')):?>
<div class="alert alert-success">
<?php echo Application::$app->session->getFlash('success'); ?>
</div>
<?php endif; ?>
{{content}}
</div>
我不知道为什么它不起作用
解决方案
两个可能的嫌疑人:
- 您
'flash'
在销毁会话时取消设置索引。这意味着当一个请求结束时(第一个),数据被清除。我建议您在调用时从这个数组中删除一个特定的键getFlash()
,这样每条消息只会得到一次。 - 当第二个请求已被处理但会话尚未写入存储时(通常由 PHP 异步处理),您可能需要添加对
session_write_close()
. 这会立即结束会话并将数据直接写入会话存储,使其可用于第二个请求(重定向之后的请求)。在进行重定向之前,您必须调用它。
旁注:您的“自定义 MVC 框架”代码看起来可以存在于 Laravel 中。如果是这样,该redirect()
方法可能已经调用了,session_write_close()
所以我的第二点将没有实际意义。
推荐阅读
- jquery - 如何使用 jquery 仅从该 HTML 表的可见行中检索值?
- django - Django forms.validation 错误未显示
- mathjax - 下标中的花括号导致 mathjax 中的渲染问题
- python - 用 Python 计算 Keras 神经网络的准确度
- f# - 如何在 F# 中传递带有偏移量的数组?
- android - Android Studio:无效缓存/重启后未解决的对活动主的引用
- sparql - 如何删除重复的空白节点
- java - 具有多个操作的 Java 计算器出现字符串错误
- python - Tweepy 回复提及机器人
- sql - SQL 查询选择小于或等于现有列的 (max - min) 的行