Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сессии

Сессия — данные одного посетителя, которые сервер хранит между запросами: кто вошёл на сайт, что лежит в корзине. Браузер получает только 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(): форма, отправленная без него или с чужим токеном, проверку не пройдёт.

Частая ошибка

В сессию не кладут большие объекты и целые строки таблиц: они сохраняются при каждом запросе и устаревают, когда данные в базе меняются. Храните в сессии только идентификаторы и небольшие значения, а сами данные каждый раз берите из базы.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.