问题描述
你好,我想在重定向后创建(发布添加)发布或更新(发布更新)或删除(发布为删除)时在会话中创建Flash消息。我成功显示了消息,但是当我更新同一页面时,消息又出现了,我想删除此消息。我尝试取消设置($ _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,$default = null) {
if (!isset($this->flash[$key])) {
$message = $this->get($key,$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 =树枝类中addGlobal中的新PHPSession()更改
$this->twig->addGlobal('flash',new PHPSession());
但是我不知道在Flash消息后可以在哪里为删除会话取消会话设置。 如果有人可以帮助我 我将感谢他。谢谢
解决方法
例如,您需要将类PHPSession传递给模板,而不是传递超全局$_SESSION
$this->twig->addGlobal('_session',new PHPSession());
此外,我会将您的ensureStarted()
调用移到类的构造函数中,如果您在get
函数中执行此操作,则可能已经输出了,从而阻止了会话的开始。还要删除static
方法,这里不需要它们
似乎您将此类用作会话包装器,所以我想添加快速消息,建议添加一个额外的函数getFlash
,该函数可以取消设置所调用的变量。 / p>
(请注意,您没有向我们展示“ 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 %}