A free and open-source book on ZF3 for beginners


15.4. Контейнеры сессий

После того, как вы настроили менеджер сессий, вы можете хранить данные в сессии, извлекать данные из сессии, а также добавлять данные в сессию. Для этого используются контейнеры сессий. Контейнеры сессий реализуются классом Container, содержащимся в пространстве имен Zend\Session.

Контейнер сессии может быть использован для сохранения данных в сессию и их извлечения из сессии. Чтобы избежать конфликтов имен между различными классами, модулями и компонентами, использующими сессии, контейнер позволяет вам указать пространство имен, в котором будут храниться данные. Пространство имен контейнера может содержать символы верхнего и нижнего регистров, нижние подчеркивания и обратные слеши. Так, например, можно использовать такие имена, как "Session\ContainerName", "session_container_name" и "SessionContainerName".

Контейнеры сессий тесно работают с менеджером сессий. Когда вы создаете контейнер, он автоматически вызывает метод менеджера start(), тем самым запуская и инициализируя сессию.

Теперь давайте начнем использовать контейнеры. Контейнер можно создать двумя эквивалентными способами: либо инстанцировать контейнер вручную, либо позволить сделать это фабрике. Мы рекомендуем второй, более простой способ.

15.4.1. Способ 1. Инстанцирование контейнера сессий вручную

Можно просто создать контейнер сессий с помощью оператора new, но нужно передать экземпляр менеджера сессий в конструктор контейнера:

use Zend\Session\Container;

// Мы предполагаем, что переменная $sessionManager является экземпляром менеджера сессий.
$sessionContainer = new Container('ContainerNamespace', $sessionManager);

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

15.4.2. Способ 2. Создание контейнера сессий с использованием фабрики

Этот способ эквивалентен первому, однако контейнер сессий создается фабрикой. Вам нужно просто зерагистрировать нужные вам пространства имен контейнеров. Для этого добавьте ключ session_containers в файл module.config.php, как показано ниже:

<?php
return [
    // ...
    'session_containers' => [
        'ContainerNamespace'
    ],
];

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

Как только вы зарегистрировали имя контейнера (или несколько имен контейнеров), вы можете создать контейнер и начать работать с ним. Как правило, это делается в классе фабрики с помощью менеджера сервисов:

// Переменная $container является менеджером сервисов.
$sessionContainer = $container->get('ContainerNamespace');

Как видите, контейнер сессий извлекается из менеджера сервисов по его зарегистрированному имени.

15.4.3. Сохранение данных в сессию с помощью контейнера сессий

После создания контейнера сессий, вы можете сохранять в него данные следующим образом:

$sessionContainer->myVar = 'Some data';

Чтобы извлечь данные из контейнера сессий, воспользуйтесь данным кодом:

if(isset($sessionContainer->myVar))
    $myVar = $sessionContainer->myVar;
else
    $myVar = null;

Для удаления данных из сессии используйте следующий код:

unset($sessionContainer->myVar);

За практическими примерами использования контейнеров сессий, пожалуйста, обратитесь к разделу Реализация многошаговых форм


Top