Почему моей флешки больше нет?

Я настроил свой сеанс в прослушивателе событий ядра запроса, где я обновляю переменную сеанса last_seen следующим образом:

class RequestListener
{
    public $session;

    public function __construct( Session $session ) {
        //leave blank
        $this->session=$session;
    }

    public function onKernelRequest( GetResponseEvent $event ) {
        if ( HttpKernel::MASTER_REQUEST != $event->getRequestType() ) {
            // don't do anything if it's not the master request
            return;
        }
        else {

            $session      = $this->session;
            $current_time = time();

            //if they're logged in and it hasn't been more than an hour since their last request
            if ( $session->get( 'auth' ) ) {
                if ( ( (int) $session->get( 'last_seen' ) ) > ( $current_time - 10 ) ) {//timeout: half hour (temporarily changed to ten seconds)
                    //regenerate session ID:
                    $session->migrate();
                }
                else {
                    //destroy session
                    $session->invalidate();//shortcut for clear() & then migrate()

                    //set session variable to acknowledge timeout
                    $session->getFlashBag()->add( 'info', 'You were automatically logged out due to inactivity' );
                }
                $session->set( 'last_seen', $current_time );
            }
            else {
                $session->set( 'last_seen', $current_time );
            }
        }
    }
}

Этот код запускается для каждого запроса. Как вы можете видеть, флэш-сообщение с информацией о flashbag настроено на хранение You were automatically logged out due to inactivity, но оно никогда не отображается.


Мой шаблон ветки:

Я знаю, что в этом не должно быть ничего плохого, потому что я вижу другие вспышки в других ситуациях.

{# START info messages #}
{% set info_messages = app.session.flashbag.get('info') %}
{% if info_messages is defined and info_messages is not empty%}
    <div class="row alert alert-info alert-block">
        <ul>
            {% for info_message in info_messages %}
            <li>{{info_message | raw}}</li>
            {% endfor %}
        </ul>
    </div>
{% endif %}
{# END info messages #}

Итак, поток, который я тестировал, таков:

  1. Пользователь попадает на страницу входа
  2. Отправить форму входа (обновляет маршрут входа)
  3. Вход считается успешным, перенаправление на другую страницу (скажем, страницу B)
  4. Подождите десять секунд и обновите
  5. Событие ядра должно очистить сеанс и добавить элемент в флешку.
  6. Когда контроллер для маршрута страницы B достигнут, он проверяет сеанс, чтобы убедиться, что пользователь вошел в систему, а затем перенаправляет на страницу входа, потому что они не зарегистрированы.
  7. Страница входа просто отображает шаблон ветки, вспышка не видна

Это как-то связано с автоматическим истечением срока действия флэш-сообщений, которое кратко упоминается в документация?

Я подозреваю, что это простая проблема с сеансом, на которую, возможно, повлияли перенаправления или автоматическое истечение срока действия.


Редактировать

Я также попытался изменить свою функцию onKernelRequest, чтобы она запускала код обработки сеанса действительно для каждого запроса (удалена проверка MASTER_REQUEST)


Редактировать 2

Я пытался использовать $session->setFlash('info', '...message...') вместо $session->getFlashBag()->add(...) в своем слушателе и контроллере и app.session.flashes('info') вместо app.session.flashbag.get('info') в моем шаблоне, как это было предложено на IRC-канале #symfony, но все равно безуспешно.


person Adam Lynch    schedule 07.09.2012    source источник
comment
Есть ли у вас какие-либо другие запущенные задачи, которые могут вызвать этот код в течение этого 10-секундного окна? сердцебиение? "что-нибудь новое" проверить?   -  person Marc B    schedule 07.09.2012
comment
@MarcB Нет, не думаю. Извините, а что?   -  person Adam Lynch    schedule 07.09.2012


Ответы (1)


Это связано с ошибкой в ​​Symfony2.1.

В документации говорится, что функция $session->invalidate() такая же как $session->clear(), так и $session->migrate(), но это не потому, что в моем примере всплывающее сообщение отображается, когда используется последнее, а не первое.

См. проблему на Github Symfony.

person Adam Lynch    schedule 11.09.2012