HTTP запросы не имеют механизма хранения своего состояния, для этого необходимы сессии, которые предоставляют удобный вариант хранения пользовательской информации между запросами. Эта информация обычно помещается в постоянное хранилище, к которому можно получить доступ из других HTTP запросов.
Конфигурационный файл сессии приложения расположен в config/session.php. По умолчанию, используется драйвер file, подходящий для большинства приложений. Если приложение необходимо балансировать нагрузку между несколькими серверами, необходимо выбрать централизованное хранилище, к которому могут получить доступ все сервера, например Redis или база данных.
Imhotep реализует несколько способов взаимодействия с сессией:
session;Imhotep\Http\Request;Session.<?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. Первым аргумент которого принимает название ключа, а второй необязательный принимает значение по умолчанию:
$value = $request->session()->get('key');
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function () {
return 'default';
});
// Глобальный помощник session, поддерживает дополнительные варианты использования
$value = session('key');
$value = session('key', 'default');
Используя метод all, можно получить массив со всеми данными сессии:
$data = $request->session()->all();
Чтобы определить, присутствует ли элемент в сессии, используйте метод has. Метод возвращает true, если элемент присутствует, и не равен null:
if ($request->session()->has('token')) {
// ...
}
Чтобы определить, присутствует ли элемент в сессии, даже если его значение равно null, используйте метод exists:
if ($request->session()->exists('token')) {
// ...
}
Чтобы определить, отсутствует ли элемент в сессии, вы можете использовать метод missing. Метод возвращает true, если элемент имеет значение null или если элемент отсутствует:
if ($request->session()->missing('token')) {
// ...
}
Для сохранения данных в сессии используется метод put:
$request->session()->put('key', 'value');
// Короткий вариант добавления данных, через глобального помощника session
session(['key' => 'value']);
Метод push используется для вставки нового значения в значение сессии, которое является массивом. Например, если ключ user.teams содержит массив названий команд, то вы можете поместить новое значение в массив следующим образом:
$request->session()->push('user.teams', 'developers');
Метод pull извлекает и удаляет элемент из сессии единым выражением:
$value = $request->session()->pull('key', 'default');
Если запись содержит целое число, которое необходимо увеличить или уменьшить, тогда используйте методы 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();