Encodera

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

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

Оглавление

Сессии и сообщения на один запрос

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

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

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