Я настроил свой сеанс в прослушивателе событий ядра запроса, где я обновляю переменную сеанса 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 #}
Итак, поток, который я тестировал, таков:
- Пользователь попадает на страницу входа
- Отправить форму входа (обновляет маршрут входа)
- Вход считается успешным, перенаправление на другую страницу (скажем, страницу B)
- Подождите десять секунд и обновите
- Событие ядра должно очистить сеанс и добавить элемент в флешку.
- Когда контроллер для маршрута страницы B достигнут, он проверяет сеанс, чтобы убедиться, что пользователь вошел в систему, а затем перенаправляет на страницу входа, потому что они не зарегистрированы.
- Страница входа просто отображает шаблон ветки, вспышка не видна
Это как-то связано с автоматическим истечением срока действия флэш-сообщений, которое кратко упоминается в документация?
Я подозреваю, что это простая проблема с сеансом, на которую, возможно, повлияли перенаправления или автоматическое истечение срока действия.
Редактировать
Я также попытался изменить свою функцию onKernelRequest, чтобы она запускала код обработки сеанса действительно для каждого запроса (удалена проверка MASTER_REQUEST
)
Редактировать 2
Я пытался использовать $session->setFlash('info', '...message...')
вместо $session->getFlashBag()->add(...)
в своем слушателе и контроллере и app.session.flashes('info')
вместо app.session.flashbag.get('info')
в моем шаблоне, как это было предложено на IRC-канале #symfony, но все равно безуспешно.