Сессии

Дата обновления перевода 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.

Избегайте запуска сессий для анонимных пользователей

Сессии автоматически запускаются каждый раз, когда вы читаете, пишете или просто проверяете существование данных в сессии. Это может навредить производительности вашего приложения, так как все пользователи получат куки сессии. Для того, чтобы предотвратить это, вы должны полностью избежать доступа к сессии.