Сессии
HTTP-запросы по своей природе не сохраняют состояние между вызовами. Для решения этой проблемы используются сессии — механизм, позволяющий хранить данные пользователя между запросами. Информация из сессии обычно сохраняется в постоянном хранилище и доступна при последующих HTTP-запросах.
Конфигурирование
Файл конфигурации сессий находится по пути config/session.php. По умолчанию используется драйвер file, который подходит для большинства приложений. Если приложение работает в режиме балансировки нагрузки между несколькими серверами, рекомендуется использовать централизованное хранилище, например Redis или базу данных.
Imhotep поддерживает следующие драйверы сессий:
| Драйвер | Описание |
|---|---|
array |
Сессии хранятся в памяти в виде массива. Используется только для тестирования. |
file |
Сессии хранятся в файлах на диске. Подходит для большинства приложений. |
cache |
Сессии хранятся в кэше. Требуется настройка хранилища кеша. |
cookie |
Сессии хранятся в зашифрованных cookies. Ограничены размером cookie. |
database |
Сессии хранятся в базе данных. Требует создания таблицы для сессий. |
При использовании драйвера database необходимо создать таблицу для хранения сессий. Для этого выполните команду:
php imhotep session:table
Она создаст миграцию с нужной структурой таблицы. Затем примените миграцию:
php imhotep migrate
Взаимодействие с сессией
Imhotep реализует несколько способов взаимодействия с сессией:
- через глобального помощника
session; - через экземпляр
Imhotep\Http\Request; - через фасад
Session.
Важно: Для работы сессий необходимо добавить middleware
StartSessionв цепочку обработки запросов. Обычно это делается в файлеapp/Http/Kernel.php:protected $middleware = [ \Imhotep\Session\Middleware\StartSession::class, // ... ];PHP
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Imhotep\Http\Request;
use Imhotep\Facades\Session;
class UserController extends Controller
{
public function show(Request $request)
{
$value = $request->session()->get('key');
// или
$value = session()->get('key');
// или
$value = Session::get('key');
}
}
Получение данных
Получение конкретного значения
Для получения данных из сессии используйте метод get. Первым аргументом принимается название ключа. Dторой необязательный аргумент - значение по умолчанию, которое вернется, если ключ не существует:
use Imhotep\Facades\Session;
$value = Session::get('key', 'default-value');
$value = Session::get('key', function () {
return 'default-value';
});
// Глобальный помощник session
$value = session('key', 'default-value');
Получение с автоматическим сохранением значения по умолчанию
Метод remember позволяет получить значение из сессии, а если оно отсутствует - создать его с помощью callback-функции и сразу сохранить в сессию. Это удобно для ленивой инициализации данных:
$value = Session::remember('key', function () {
return 'default-value';
});
Получение значения с последующим удалением элемента
Метод pull извлекает и удаляет элемент из сессии единым выражением:
$value = Session::pull('key', 'default');
Получение всех данных из сессии
Чтобы получить массив всех данных, хранящихся в текущей сессии, используйте метод all:
$data = Session::all();
Проверка наличия данных в сессии
Чтобы определить, присутствует ли элемент в сессии, используйте метод has. Метод возвращает true, если элемент присутствует, и не равен null:
if (Session::has('token')) {
// ...
}
Чтобы определить, присутствует ли элемент в сессии, даже если его значение равно null, используйте метод exists:
if (Session::exists('token')) {
// ...
}
Чтобы определить, отсутствует ли элемент в сессии, вы можете использовать метод missing. Метод возвращает true, если элемент имеет значение null или если элемент отсутствует:
if (Session::missing('token')) {
// ...
}
Сохранение данных
Для сохранения данных в сессии используется метод put:
Session::put('key', 'value');
// Альтернативный вариант добавления данных, через глобального помощника session
session(['key' => 'value']);
Добавление в массив значений
Метод push используется для вставки нового значения в значение сессии, которое является массивом. Например, если ключ user.teams содержит массив названий команд, то вы можете поместить новое значение в массив следующим образом:
Session::push('user.teams', 'developers');
Увеличение и уменьшение целочисленных значений
Если запись содержит целое число, которое необходимо увеличить или уменьшить, тогда используйте методы increment и decrement. Вторым необязательным аргументом, можно установить число, на которое необходимо увеличить или уменьшить значение, по умолчанию равно 1:
$request->session()->increment('count'); // Увеличивает значение count на 1
$request->session()->increment('count', 2); // Увеличивает значение count на 2 пункта
$request->session()->decrement('count');// Уменьшает значение count на 1
$request->session()->decrement('count', 2); // Уменьшает значение count на 2 пункта
Кратковременные данные
С помощью метода flash, можно сохранить элементы в сессии для текущего и только для следующего HTTP-запроса. После следующего HTTP-запроса данные будут удалены. Кратковременные данные полезны например для краткосрочных статусных сообщений:
$request->session()->flash('status', 'Task was successful!');
Если нужно сохранить кратковременные данные для нескольких запросов, используйте метод reflash, который сохранит все данные для дополнительного запроса. Если нужно сохранить конкретные кратковременные данные, используйте метод keep:
$request->session()->reflash();
$request->session()->keep(['username', 'email']);
Чтобы сохранить кратковременные данные только для текущего запроса, используйте метод now:
$request->session()->now('status', 'Task was successful!');
Удаление данных
Метод forget удаляет часть данных из сессии. Если нужно удалить все данные, используйте метод flush:
$request->session()->forget('name');
// Удаление нескольких элементов. Вариант 1
$request->session()->forget('name', 'status');
// Удаление нескольких элементов. Вариант 2
$request->session()->forget(['name', 'status']);
// Удаление всех данных
$request->session()->flush();
Пересоздание идентификатора сессии
Пересоздание идентификатора сессии часто выполняется для предотвращения использования злоумышленниками атаки Session Fixation.
Imhotep автоматически пересоздает идентификатор сессии во время аутентификации, если используется базовый компонент Auth.
Если необходимо вручную изменить идентификатор сессии, тогда используйте метод regenerate:
$request->session()->regenerate();
Если необходимо изменить идентификатор сессии и удалить все данные, используйте метод invalidate:
$request->session()->invalidate();