Сессии

HTTP-запросы по своей природе не сохраняют состояние между вызовами. Для решения этой проблемы используются сессии — механизм, позволяющий хранить данные пользователя между запросами. Информация из сессии обычно сохраняется в постоянном хранилище и доступна при последующих HTTP-запросах.

Конфигурирование

Файл конфигурации сессий находится по пути config/session.php. По умолчанию используется драйвер file, который подходит для большинства приложений. Если приложение работает в режиме балансировки нагрузки между несколькими серверами, рекомендуется использовать централизованное хранилище, например Redis или базу данных.

Imhotep поддерживает следующие драйверы сессий:

Драйвер Описание
array Сессии хранятся в памяти в виде массива. Используется только для тестирования.
file Сессии хранятся в файлах на диске. Подходит для большинства приложений.
cache Сессии хранятся в кэше. Требуется настройка хранилища кеша.
cookie Сессии хранятся в зашифрованных cookies. Ограничены размером cookie.
database Сессии хранятся в базе данных. Требует создания таблицы для сессий.

При использовании драйвера database необходимо создать таблицу для хранения сессий. Для этого выполните команду:

php imhotep session:table
BASH

Она создаст миграцию с нужной структурой таблицы. Затем примените миграцию:

php imhotep migrate
BASH

Взаимодействие с сессией

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');
    }
}
PHP

Получение данных

Получение конкретного значения

Для получения данных из сессии используйте метод 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');
PHP

Получение с автоматическим сохранением значения по умолчанию

Метод remember позволяет получить значение из сессии, а если оно отсутствует - создать его с помощью callback-функции и сразу сохранить в сессию. Это удобно для ленивой инициализации данных:

$value = Session::remember('key', function () {
    return 'default-value';
});
PHP

Получение значения с последующим удалением элемента

Метод pull извлекает и удаляет элемент из сессии единым выражением:

$value = Session::pull('key', 'default');
PHP

Получение всех данных из сессии

Чтобы получить массив всех данных, хранящихся в текущей сессии, используйте метод all:

$data = Session::all();
PHP

Проверка наличия данных в сессии

Чтобы определить, присутствует ли элемент в сессии, используйте метод has. Метод возвращает true, если элемент присутствует, и не равен null:

if (Session::has('token')) {
    // ...
}
PHP

Чтобы определить, присутствует ли элемент в сессии, даже если его значение равно null, используйте метод exists:

if (Session::exists('token')) {
    // ...
}
PHP

Чтобы определить, отсутствует ли элемент в сессии, вы можете использовать метод missing. Метод возвращает true, если элемент имеет значение null или если элемент отсутствует:

if (Session::missing('token')) {
    // ...
}
PHP

Сохранение данных

Для сохранения данных в сессии используется метод put:

Session::put('key', 'value');

// Альтернативный вариант добавления данных, через глобального помощника session
session(['key' => 'value']);
PHP

Добавление в массив значений

Метод push используется для вставки нового значения в значение сессии, которое является массивом. Например, если ключ user.teams содержит массив названий команд, то вы можете поместить новое значение в массив следующим образом:

Session::push('user.teams', 'developers');
PHP

Увеличение и уменьшение целочисленных значений

Если запись содержит целое число, которое необходимо увеличить или уменьшить, тогда используйте методы 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 пункта
PHP

Кратковременные данные

С помощью метода flash, можно сохранить элементы в сессии для текущего и только для следующего HTTP-запроса. После следующего HTTP-запроса данные будут удалены. Кратковременные данные полезны например для краткосрочных статусных сообщений:

$request->session()->flash('status', 'Task was successful!');
PHP

Если нужно сохранить кратковременные данные для нескольких запросов, используйте метод reflash, который сохранит все данные для дополнительного запроса. Если нужно сохранить конкретные кратковременные данные, используйте метод keep:

$request->session()->reflash();

$request->session()->keep(['username', 'email']);
PHP

Чтобы сохранить кратковременные данные только для текущего запроса, используйте метод now:

$request->session()->now('status', 'Task was successful!');
PHP

Удаление данных

Метод forget удаляет часть данных из сессии. Если нужно удалить все данные, используйте метод flush:

$request->session()->forget('name');

// Удаление нескольких элементов. Вариант 1
$request->session()->forget('name', 'status');

// Удаление нескольких элементов. Вариант 2
$request->session()->forget(['name', 'status']);

// Удаление всех данных
$request->session()->flush();
PHP

Пересоздание идентификатора сессии

Пересоздание идентификатора сессии часто выполняется для предотвращения использования злоумышленниками атаки Session Fixation.

Imhotep автоматически пересоздает идентификатор сессии во время аутентификации, если используется базовый компонент Auth.

Если необходимо вручную изменить идентификатор сессии, тогда используйте метод regenerate:

$request->session()->regenerate();
PHP

Если необходимо изменить идентификатор сессии и удалить все данные, используйте метод invalidate:

$request->session()->invalidate();
PHP