Сессии
Дата обновления перевода 2023-01-11
Сессии
Symfony предоставляет объект сессий и несколько утилит, которые вы можете использовать для хранения информации о пользователе между запросами.
Конфигурация
Сессии предоставляются компонентом HttpFoundation, который включен во все приложения Symfony, независимо от того, как вы ее устанавливали. До использования сессий, посмотрите на конфигурацию по умолчанию:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12
# config/packages/framework.yaml
framework:
# Включает поддержку сессий. Отметьте, что сессия будет начата ТОЛЬКО, если вы читаете из нее или пишете в нее.
# Удалите или прокомментируйте этот раздел, чтобы ясно отключить поддержку сессий.
session:
# ID сервиса, использованного для хранения сессии
# NULL означает, что Symfony использует механизм сессий PHP по умолчанию
handler_id: null
# улучшает безопасность куки, используемых для сессий
cookie_secure: auto
cookie_samesite: lax
storage_factory_id: session.storage.factory.native
Установка опции конфигурации handler_id
как null
, означает, что Symfony
будет использовать нативный PHP-механизм сессий. Файлы метаданных сессии будут
храниться вне приложения Symfony, в каталоге, управлемом PHP. Хотя это обычно
все упрощает, некоторые опции срока годности сессий могут работать не так, как
ожидается, если другие приложения, пишущиеся в тот же каталог, имеют настройки
короткого максимального жизненного цикла.
Если вы хотите, вы можете использовать сервис session.handler.native_file
в качестве handler_id
, чтобы позволить Symfony управлять сессиями самостоятельно.
Другая полезная опция - save_path
, которая определяет каталог, в котором Symfony
будет хранить файлы метаданных сессии:
- YAML
- XML
- PHP
1 2 3 4 5 6
# config/packages/framework.yaml
framework:
session:
# ...
handler_id: 'session.handler.native_file'
save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
Просмотрите справочник конфигурации Symfony, чтобы узнать больше о других доступных опциях конфигурации Сессии . Вы также можете хранить сессии в базе данных.
Базовое применение
Сессия доступна через Request
и RequestStack
. Symfony предоставляет сервис
request_stack
, который внедряется в ваши сервисы и контроллеры, если вы
используете в аргументе подсказку
RequestStack:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
use Symfony\Component\HttpFoundation\RequestStack;
class SomeService
{
private $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
// Получение доступа к сессии в конструкторе *НЕ* рекомендуется, так как
// к ней еще может не быть доступа или это может привести к нежелательным побочным эффектам
// $this->session = $requestStack->getSession();
}
public function someMethod()
{
$session = $this->requestStack->getSession();
// сохраняет атрибут в сессии для дальнейшего повторного использования
$session->set('attribute-name', 'attribute-value');
// получает атрибут по имени
$foo = $session->get('foo');
// второй аргумент - это значение, возвращенное, если атрибут не существует
$filters = $session->get('filters', []);
// ...
}
}
Сохраненные атрибуты остаются в сессии до конца этой сессии пользователя. По умолчанию, атрибуты сессии - это пары ключ-значение, управляеыые классом AttributeBag.
Избегайте запуска сессий для анонимных пользователей
Сессии автоматически запускаются каждый раз, когда вы читаете, пишете или просто проверяете существование данных в сессии. Это может навредить производительности вашего приложения, так как все пользователи получат куки сессии. Для того, чтобы предотвратить это, вы должны полностью избежать доступа к сессии.