不带Symfony的树枝出现问题Flash消息

问题描述

你好,我想在重定向后创建(发布添加)发布或更新(发布更新)或删除(发布为删除)时在会话中创建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 %}

demo