php - 没有 Symfony 的带有树枝的问题闪烁消息
问题描述
您好,我想在重定向后创建(添加后)发布或更新(更新后)或删除(发布为删除)时在会话中创建 Flash 消息。我成功显示消息,但是当我更新同一页面时,消息再次出现,我想删除此消息。我尝试 unset($_session[$value]) 但没有。在我的控制器中:
$phpsession = new PHPSession();
$flashmessage = $phpsession->get('succes', 'comment added');
header('location: /blog/comment/'.$postid);
exit;
PHPSession 是我的课堂会话:
class PHPSession
{ 受保护的 $flash = [];
public function __construct(){
$this->ensureStarted();
}
private function ensureStarted() {
if (session_status() === PHP_SESSION_NONE){
session_start();
}
}
public function get(string $key, $value, $default = null)
{
$_SESSION[$key] = $value;
return isset($_SESSION[$key]) ? $_SESSION[$key] : $default;
}
public function getFlashMessage(string $key, $value, $default = null) {
if (!isset($this->flash[$key])) {
$message = $this->get($key, $value, $default);
unset($_SESSION[$key]);
$this->flash[$key] = $message;
}
return $this->flash[$key];
}
}
在我的树枝视图中:
{% if flash.getFlashMessage('succes', 'comment added') %}
<div class="alert alert-success mt-4" role="alert">
<p>ok</p>
</div>
{% endif %}
在我看来 flash = new PHPSession() 在 twig 类中 addGlobal 的变化
$this->twig->addGlobal('flash', new PHPSession());
但我不知道在哪里可以在 flash message 之后为删除会话取消设置会话。如果有人可以帮助我,我会很感激他。谢谢
解决方案
而不是传递超全局$_SESSION
,您需要将您的类 PHPSession 传递给您的模板,例如
$this->twig->addGlobal('_session', new PHPSession());
另外,我会将您的ensureStarted()
调用移至您的类的构造函数,如果您在get
函数中执行此操作,则很可能已经有输出,从而阻止了会话启动。也放弃static
方法,这里没有必要
看来您正在使用此类作为会话包装器,所以我想添加 Flash 消息,我建议添加一个getFlash
可以取消设置被调用变量的额外函数。
(请记住,您没有向我们展示接口“SessionInterface”的约束)
<?php
class PHPSession {
protected $flash = [];
public function __construct() {
$this->ensureStarted();
}
private function ensureStarted() {
if (session_status() === PHP_SESSION_NONE) session_start();
}
public function set($key, $value) {
$_SESSION[$key] = $value;
return $this;
}
public function get(string $key, $default = null) {
return $_SESSION[$key] ?? $default;
}
public function getFlashMessage(string $key, $default = null) {
if (!isset($this->flash[$key])) {
$message = $this->get($key, $value, $default);
unset($_SESSION[$key]);
$this->flash[$key] = $message;
}
return $this->flash[$key];
}
}
<?php
$php_session = new PHPSession();
$twig->addGlobal('_session', $php_session);
if (!empty($_POST)) {
$php_session->set('success', 'This is a flash message');
header('Location: '.$_SERVER['PHP_SELF']);
exit;
}
echo $twig->render('session.html');
然后你应该能够在树枝中使用它,例如
{% block body %}
{% if _session.getFlashMessage('success') %}
<div class="alert alert-success mt-4" role="alert">
{{ _session.getFlashMessage('success') }}
</div>
{% endif %}
{% endblock %}