Сообщение о проблеме с веткой без Symfony

Здравствуйте, я хочу создать флэш-сообщение в сеансе, когда я создаю (добавляю сообщение), публикую или обновляю (обновляю сообщение) или удаляю (сообщение удаляется) после перенаправления. Мне удалось отобразить сообщение, но когда я обновляю ту же страницу, сообщение снова появляется, и я хочу удалить это сообщение. Я пытаюсь сбросить($_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 = новое изменение PHPSession() в addGlobal в классе twig

$this->twig->addGlobal('flash', new PHPSession());

но я не знаю, где я могу отключить сеанс для удаления сеанса после флэш-сообщения. Если кто-то может мне помочь, я был бы благодарен ему. Спасибо


person Thomas Da Silva    schedule 03.09.2020    source источник
comment
Почему ваш PHPSession::get УСТАНАВЛИВАЕТ $vaule в сеансе? $_SESSION[$key] = $value;. Насколько я знаю, Twig получает копию $_SESSION, также $_session не совпадает с $_SESSION. У вас нигде нет переменной $_session. В вопросе вы пишете: unset($_session[$value]) - почему $value, разве это не должно быть $key? Что бы я сделал, это создать класс Session с методами set/get/getAndRemove, передать объект этого класса в свою ветку и просто вызвать session.getAndRemove('success')   -  person blahy    schedule 04.09.2020
comment
это $_SESSION[$key] = $value, но в моем контроллере я вызываю методы get или getAndRemove? @blahy   -  person Thomas Da Silva    schedule 04.09.2020


Ответы (1)


Вместо передачи суперглобального $_SESSION вам нужно будет передать свой класс PHPSession в свой шаблон, например.

$this->twig->addGlobal('_session', new PHPSession());

Также я бы переместил ваш вызов ensureStarted() в конструктор вашего класса, если вы сделаете это в функции get, скорее всего, там уже был вывод, что предотвратило запуск сеанса. Также отбросьте методы static, здесь они не нужны

Кажется, вы используете этот класс в качестве оболочки сеанса, поэтому я хотел добавить флэш-сообщения, я бы рекомендовал добавить дополнительную функцию 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 %}

демонстрация

person DarkBee    schedule 04.09.2020
comment
Я упростил свой код, удалил интерфейс «SessionInterface», который зря использовал, и добавил метод для флэш-сообщения. но сообщение появляется даже тогда, когда я не запускаю свое действие, чтобы добавить комментарий, например. даже удалить сессию она останется. вопрос, вы должны вызвать метод get моего класса PHPSession в моем контроллере: $phpsession = new PHPSession(); $flashmessage = $phpsession->get('succes', 'comment added');, потому что даже без этого вызова в моем представлении он отображает его каждый раз: {% if flash.getFlashMessage('succes', 'comment added') %}. @DarkBee - person Thomas Da Silva; 04.09.2020
comment
okok Это работает, я благодарю вас за вашу помощь, очень, очень, спасибо @DarkBee - person Thomas Da Silva; 04.09.2020