Сесії

Дата оновлення перекладу 2022-12-23

Сесії

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
32
33
34
35
36
37
38
39
use Symfony\Component\HttpFoundation\RequestStack;

class SomeService
{
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;

        // Доступ до сесії у конструкторі *НЕ* рекомендовано, так як
        // вона може бути ще недоступна або це призведе до небажаних побічних ефектів        public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;

        // Accessing the session in the constructor is *NOT* recommended, since
        // it might not be accessible yet or lead to unwanted side-effects
        // $this->session = $requestStack->getSession();
    }

        // $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.

Уникайте запуску сесії для анонімних користувачів

Сесії автоматично запускаються кожний раз, коли ви читаєте, пишете або просто перевіряєте існування даних у сесії. Це може зашкодити продуктивності вашого додатку, так як всі користувачі отримають кукі сесії. Для того, щоб запобігти цьому, ви маєте повністю уникнути доступу до сесії.