首页 > 解决方案 > 没有 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 之后为删除会话取消设置会话。如果有人可以帮助我,我会很感激他。谢谢

标签: phpsessiontwigflash-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 %}

演示


推荐阅读