Сессии и сообщения на один запрос
Сайт не помнит посетителя между запросами: каждая страница запрашивается заново. Сессия решает эту задачу — это хранилище данных, привязанное к одному посетителю: корзина, выбранный язык, признак входа. Создавать для неё файлы не нужно: с сессией работают через функцию session() в контроллерах и шаблонах.
Запись и чтение
// app/Controllers/Home.php
public function index(): string
{
$visits = (session()->get('visits') ?? 0) + 1;
session()->set('visits', $visits);
return "Вы открыли эту страницу $visits раз";
}Обновите главную страницу несколько раз — число будет расти. Если открыть сайт в другом браузере, счёт начнётся с единицы: у каждого посетителя своя сессия. Функция session() запускает сессию при первом обращении.
Методы сессии
| Вызов | Что делает |
|---|---|
session()->set('name', 'Анна') | Записывает значение |
session()->get('name') | Читает значение или возвращает null |
session('name') | Короткая запись чтения |
session()->has('name') | Проверяет, есть ли значение |
session()->remove('name') | Удаляет значение |
session()->destroy() | Удаляет всю сессию |
Сообщение на один запрос
Flash-данные — значения, которые живут ровно до следующего запроса. Ими передают сообщения вроде «Статья сохранена» через перенаправление:
// app/Controllers/Posts.php
public function create()
{
// проверка и сохранение статьи
return redirect()->to('/posts')->with('message', 'Статья сохранена');
}Метод with() записывает flash-значение. То же самое делает вызов session()->setFlashdata('message', 'Статья сохранена').
Вывод сообщения
Сообщение удобно выводить в макете, чтобы оно работало на всех страницах:
<!-- app/Views/layouts/main.php, внутри тега main -->
<?php if (session()->getFlashdata('message')): ?>
<p class="flash"><?= esc(session()->getFlashdata('message')) ?></p>
<?php endif ?>После сохранения статьи над списком появится «Статья сохранена». Обновите страницу — сообщение исчезнет.
Где хранятся сессии
Настройки лежат в app/Config/Session.php. По умолчанию данные хранятся в файлах папки writable/session, а в браузер посетителя отправляется только cookie с идентификатором сессии.
| Свойство | Что задаёт |
|---|---|
$driver | Хранилище: файлы, база данных, Redis |
$expiration | Время жизни сессии в секундах, по умолчанию 7200 |
$savePath | Папку или таблицу для хранения |
$cookieName | Имя cookie с идентификатором |
Хранилище переключают на базу данных или Redis, когда сайт работает на нескольких серверах.
Частая ошибка
Сессия — не место для больших данных. Если положить в неё список статей или объект пользователя целиком, данные устареют: запись в базе изменится, а в сессии останется старая копия. Храните в сессии только идентификаторы и мелкие настройки — например user_id, — а сами данные читайте из базы при каждом запросе.