Подтвердить что ты не робот

Как очистить контейнер сеанса в Zend framework2

Недавно я начал создавать приложение с использованием Zendframework 2, у меня есть хороший опыт работы в ZF1, главная проблема, с которой я столкнулся здесь, с ZF2 - это сеансы.

Вот как я создаю контейнер сеанса.

use Zend\Session\Container;

//Создание контейнера сеанса: (ранее мы называли его пространством имен)

$session_user = new Container('user');
$session_user_errors = new Container('usererrors');
$session_user_shares = new Container('usershares');

Теперь, как и у меня есть несколько контейнеров,

Я мог бы очистить ключ от конкретного контейнера, такого как

//Получение значения из сеанса по ключу: (получить значение из пространства имен)

$email = $session_user->offsetGet('email');

//Значение параметра в сеансе: (заданное значение из пространства имен)

$session_user->offsetSet('username', 'abcd');

Теперь моя проблема - очистить весь контейнер, который установлен на нескольких уровнях моего приложения.

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

$session_user = new Container('user');
$session_user->getManager()->getStorage()->clear();

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

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

Просьба, пожалуйста, предложить ли какой-либо альтернативный способ очистить конкретный контейнер сеанса.

ПРИМЕЧАНИЕ: - Я не использую ни один из сторонних модулей, таких как сеансы ZfcUser и Akrabat

Заранее благодарим за это сообщение.

4b9b3361

Ответ 1

У вас почти было это, вам просто нужно передать пространство имен четкому методу

$session_user->getManager()->getStorage()->clear('user');

Вы все равно можете обрабатывать $_SESSION подобно массиву, так что следующее также работает

unset($_SESSION['user']); 

Ответ 2

Ниже приведены сведения об уничтожении сеанса в Zend Framework 2:

  • Использование основных функций PHP

    Функция

    session_start() запускает сеанс.

    session_destroy() функция удаляет ВСЕ данные, хранящиеся в массиве сеансов.

Теперь, используя функциональность Zend Framework:

Для ясного понимания сначала создайте сеанс в Zend Framework, а затем выполните процесс удаления.

  • Создание сеанса

использовать Zend\Session\Container;

$session_container = new Container ('user_session');

$session_container- > last_login = date ('Y-m-d H: i: s');

$session_container- > sess_token = trim (base64_encode (md5 (microtime())), "=" );

  1. Удаление сеанса

$session = new Container ( "user_session" );

$session- > getManager() → getStorage() → ясно ( 'user_session');

Где user_session - это имя ключа массива сеансов для хранения сведений.

Ответ 3

Решение, опубликованное @Crisp, работало как Charm. Но вот альтернативный способ, который я нашел после исследования, чтобы решить эту проблему.

use Zend\Session\SessionManager;

$sessionManager = new SessionManager();

//get array of sessions from storage 
$array_of_sessions = $sessionManager->getStorage();

//Unset which ever container you want by passing its name ( ZF1 its called namespace ) 
 unset($array_of_sessions['user']);
 unset($array_of_sessions['usershares']);
 unset($array_of_sessions['actions']);

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

Это может помочь другим, обладающим собственностью создавать объекты каждого контейнера сеанса и вызывать метод clear.

Ответ 4

Чтобы уничтожить все сеансы:

  $session = new Container('base');
  $session->getManager()->destroy();

  or

используйте простую функцию уничтожения php:

 session_destroy();

Эта функция очищает все сеансы.

Надеюсь, это поможет.

Ответ 5

В ZF2 для использования контейнера;

Создать контейнер:

$sessionTokenizer = new Container('token');

Установить переменную в контейнер

$token = $sessionTokenizer->token;

Уничтожить контейнер (ТОЛЬКО КОНТЕЙНЕР)

$sessionTokenizer->offsetUnset();

Ответ 6

Вы можете очистить сеанс следующим образом:

$этом- > session- > exchangeArray (массив());