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

17

Недавно я начал создавать приложение с использованием 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

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

задан aravind.udayashankara 04.03.2013 в 06:43
источник

6 ответов

41

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

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

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

unset($_SESSION['user']); 
    
ответ дан Crisp 04.03.2013 в 07:45
источник
  • Ничего себе это тот, который я не пробовал, выглядит правильно, попробует вернуться, но некоторые как, не имеет никакого смысла в том, как работает рама, $ session_user уже является объектом контейнера, называемого пользователем снова, мы говоря в понятном методе очистки контейнера пользователя. Я пробовал это до $ session_user-> getManager () -> getStorage () -> user-> clear (); и получил ошибку, позвольте мне проверить и вернуться к вам –  aravind.udayashankara 04.03.2013 в 08:00
  • Идеальное решение, спасибо за ответ, Он работал как шарм –  aravind.udayashankara 04.03.2013 в 09:14
2

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

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

    Функция

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

    Функция

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

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

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

  1. Создание сеанса
  

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

     

$ session_container = new Container ('user_session');

     

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

     

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

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

$ session = new Container ("user_session");

     

$ session- & GT; getManager () - & GT; getStorage () - & GT; ясно ( 'user_session');

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

    
ответ дан Mohd Belal 22.12.2017 в 11:05
источник
1

Решение, опубликованное @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.     

ответ дан aravind.udayashankara 04.03.2013 в 09:21
источник
0

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

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

  or

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

 session_destroy();

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

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

    
ответ дан user2644574 06.08.2013 в 12:13
источник
-1

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

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

$sessionTokenizer = new Container('token');

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

$token = $sessionTokenizer->token;

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

$sessionTokenizer->offsetUnset();
    
ответ дан Agustincl 30.03.2015 в 21:55
источник
  • Метод offsetUnset имеет обязательный параметр $ key, поэтому это не должно работать –  kachar 14.02.2016 в 12:20
-2

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

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

ответ дан Lucas Tourinho Cavalcante 01.03.2014 в 02:17
источник