A free and open-source book on ZF3 for beginners


15.3. Менеджер сессий

ZF3 предоставляет специальный сервис SessionManager, принадлежащий пространству имен Zend\Session. Это обычный сервис ZF3 и он автоматически регистрируется в менеджере сервисов. Получить экземпляр сервиса SessionManager в классе фабрики можно с помощью следующего кода:

// Используем псевдоним для класса SessionManager.
use Zend\Session\SessionManager;

// Извлекаем экземпляр менеджера сессий из менеджера сервисов.
$sessionManager = $container->get(SessionManager::class);

Итак, что делает SessionManager? По правде говоря, он делает все для работы сессии. Краткое описание его наиболее полезных методов представлено в таблице 15.1 ниже:

Table 15.1. Methods provided by the SessionManager class
Метод Описание
sessionExists() Проверяет, существует ли сессия и активна ли она в данный момент.
start($preserveStorage = false) Запускает сессию (если она еще не запущена).
destroy(array $options = null) Завершает сессию.
getId() Возвращает ID сессии.
setId() Задает ID сессии.
regenerateId() Изменяет ID сессии на новый.
getName() Возвращает имя сессии.
setName() Переопределяет имя сессии по умолчанию (записанное в php.ini).
rememberMe($ttl = null) Задает время "жизни" cookie-файлов (в секундах).
forgetMe() Задает время "жизни" cookie-файлов, равное нулю (срок действия cookie закончится при закрытии браузера).
expireSessionCookie() Немедленно заканчивает срок действия cookie сессии.
isValid() Выполняет валидаторы сессии.

Как видите из таблицы выше, SessionManager может начать сессию и завершить ее, проверить, существует ли сессия, а также задать параметры сессии (такие как время действие cookie-данных). Он также предоставляет цепочку валидаторов, которая может содержать валидаторы сессии (они позволяют предотвратить хакерские атаки на данные сессии).

15.3.1. Определение конфигурации сессии

Класс SessionManager считывает конфигурацию приложения при инициализации, что позволяет удобным способом задать параметры сессии. Чтобы это сделать, измените файл APP_DIR/config/autoload/global.php, как показано ниже:

<?php
use Zend\Session\Storage\SessionArrayStorage;
use Zend\Session\Validator\RemoteAddr;
use Zend\Session\Validator\HttpUserAgent;

return [
    // Настройка сессии.
    'session_config' => [
        // Срок действия cookie сессии истечет через 1 час.
        'cookie_lifetime' => 60*60*1,     
        // Данные сессии будут храниться на сервере до 30 дней.
        'gc_maxlifetime'     => 60*60*24*30, 
    ],
    // Настройка менеджера сессий.
    'session_manager' => [
        // Валидаторы сессии (используются для безопасности).
        'validators' => [
            RemoteAddr::class,
            HttpUserAgent::class,
        ]
    ],
    // Настройка хранилища сессий.
    'session_storage' => [
        'type' => SessionArrayStorage::class
    ],
    
    // ...
];

Мы изменяем файл global.php, так как сессии могут использоваться любым модулем нашего сайта и не зависят от среды.

Как видите, конфигурация сессии хранится под тремя ключами:

15.3.2. Делаем менеджер сессий выбираемым по умолчанию

Многие компоненты ZF3 используют менеджер сессий неявно (например, плагин контроллера FlashMessenger и помощник представления используют сессию для сохранения сообщений между HTTP-запросами). Чтобы эти компоненты могли использовать только что настроенный вами менеджер сессий, нужно сделать его выбираемым по умолчанию, инстанцировав как можно раньше. Например, менеджер сессий можно инстанцировать в методе вашего модуля onBootstrap(), как показано ниже:

<?php
namespace Application;

use Zend\Mvc\MvcEvent;
use Zend\Session\SessionManager;

class Module
{
    //...
    
    /**
     * Этот метод вызывается по завершении самозагрузки MVC. 
     */
    public function onBootstrap(MvcEvent $event)
    {
        $application = $event->getApplication();
        $serviceManager = $application->getServiceManager();
        
        // Следующая строка инстанцирует SessionManager и автоматически
        // делает его выбираемым 'по умолчанию'.
        $sessionManager = $serviceManager->get(SessionManager::class);
    }
}

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


Top