ZF3 предоставляет специальный сервис SessionManager
, принадлежащий пространству имен Zend\Session
. Это
обычный сервис ZF3 и он автоматически регистрируется в менеджере сервисов. Получить экземпляр сервиса
SessionManager
в классе фабрики можно с помощью следующего кода:
// Используем псевдоним для класса SessionManager.
use Zend\Session\SessionManager;
// Извлекаем экземпляр менеджера сессий из менеджера сервисов.
$sessionManager = $container->get(SessionManager::class);
Итак, что делает SessionManager
? По правде говоря, он делает все для работы сессии.
Краткое описание его наиболее полезных методов представлено в таблице 15.1 ниже:
Метод | Описание |
---|---|
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-данных). Он также предоставляет цепочку валидаторов, которая
может содержать валидаторы сессии (они позволяют предотвратить хакерские атаки на данные сессии).
Класс 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
, так как сессии могут использоваться любым модулем нашего сайта и не зависят от среды.
Как видите, конфигурация сессии хранится под тремя ключами:
Ключ session_config
позволяет определить срок действия cookie-файлов, а также срок хранения данных сессии
на сервере.
На самом деле, этот ключ может содержать и другие опции сессии, но для простоты мы их пропустим (если хотите
переопределить эти опции, обратитесь к документации Zend Framework).
Ключ session_manager
позволяет задать валидаторы сессии. Они используются для повышения безопасности. Рекомендуется
всегда указывать данные валидаторы.
Ключ session_storage
позволяет указать класс хранилища сессии. Мы используем класс SessionArrayStorage
, который
является хранилищем по умолчанию, и в большинстве случаев его функционала достаточно.
Многие компоненты 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);
}
}
Очень важно сделать менеджер сессий выбираемым по умолчанию, иначе вам придется явно передавать его каждому компоненту, который от него зависит, что является довольно скучным занятием.