Сессии
Сессия — данные одного посетителя, которые сервер хранит между запросами: кто вошёл на сайт, что лежит в корзине. Браузер получает только cookie с номером сессии. В Laminas с сессиями работает пакет laminas-session.
Установка
composer require laminas/laminas-sessionСогласитесь вписать модуль Laminas\Session в config/modules.config.php.
Контейнер сессии
Данные сессии читают и записывают через объект Container. Создавать для него файл не нужно — объект создают прямо в действии:
// module/Blog/src/Controller/PostController.php
use Laminas\Session\Container;
public function indexAction()
{
$session = new Container('blog');
$session->visits = ($session->visits ?? 0) + 1;
return new ViewModel([
'posts' => $this->posts->fetchAll(),
'visits' => $session->visits,
]);
}Аргумент 'blog' — имя раздела сессии: данные разных частей сайта не перемешиваются. Обновите страницу /blog несколько раз — значение $this->visits в шаблоне будет расти: 1, 2, 3.
Работа со значениями
| Запись | Что делает |
|---|---|
$session->name = 'Anna' | Сохраняет значение |
$session->name | Читает значение |
isset($session->name) | Проверяет, есть ли значение |
unset($session->name) | Удаляет значение |
$session->getManager()->destroy() | Уничтожает всю сессию |
Настройки сессии
Параметры cookie и срок жизни задают в разделе session_config файла config/autoload/global.php:
// config/autoload/global.php
return [
'session_config' => [
'name' => 'blog_session',
'cookie_lifetime' => 3600,
'gc_maxlifetime' => 3600,
'cookie_httponly' => true,
],
];| Ключ | Значение |
|---|---|
name | Имя cookie |
cookie_lifetime | Сколько секунд живёт cookie в браузере |
gc_maxlifetime | Через сколько секунд сервер удаляет неиспользуемую сессию |
cookie_httponly | Запретить JavaScript читать cookie |
Чтобы настройки применились, менеджер сессий нужно один раз получить из контейнера сервисов при запуске. Это делают в методе onBootstrap() класса модуля — Laminas вызывает его в начале каждого запроса:
// module/Blog/src/Module.php
use Laminas\Mvc\MvcEvent;
use Laminas\Session\SessionManager;
public function onBootstrap(MvcEvent $event): void
{
$event->getApplication()->getServiceManager()->get(SessionManager::class);
}После этого все объекты Container используют менеджер с вашими настройками.
Защита формы: Csrf
CSRF — атака, при которой чужой сайт отправляет форму от имени вошедшего посетителя. Защита — секретный токен: он хранится в сессии и вставляется в форму скрытым полем. Добавьте элемент в конструктор PostForm:
// module/Blog/src/Form/PostForm.php
$this->add([
'name' => 'csrf',
'type' => Element\Csrf::class,
]);В шаблоне add.phtml выведите его перед кнопкой:
<!-- module/Blog/view/blog/post/add.phtml -->
<?= $this->formHidden($form->get('csrf')) ?>Элемент сам проверяет токен в isValid(): форма, отправленная без него или с чужим токеном, проверку не пройдёт.
Частая ошибка
В сессию не кладут большие объекты и целые строки таблиц: они сохраняются при каждом запросе и устаревают, когда данные в базе меняются. Храните в сессии только идентификаторы и небольшие значения, а сами данные каждый раз берите из базы.