Подтвердить что ты не робот

Как использовать сеансы имен в Symfony2

Я пытаюсь использовать сеансы symfony2. Я делаю это

    $session = $this->getRequest()->getSession();
    $session->set('token','value');

Это работает. Но я хочу использовать пространство имен в сеансе. Документация говорит

    class NamespacedAttributeBag 

предоставляет эту функцию, но я не могу понять, как ее реализовать

4b9b3361

Ответ 1

Просто откройте свой config.yml и после импорта добавьте:

parameters:
    session.attribute_bag.class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag

Он выглядит следующим образом:

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }

parameters:
    session.attribute_bag.class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag

framework:
# ...

Ответ 2

Вы должны переопределить сеансовую службу, а также определить сервис для вашего пакета атрибутов (если вы проверите реализацию по умолчанию session.attribute_bag, вы увидите, что эта служба имеет только атрибут класса).

И добавьте новую службу в переопределенную службу сеанса там

services:
    session:
        class: Symfony\Component\HttpFoundation\Session\Session
        arguments:
            - @session.storage
            - @your.session.attribute_bag #service id is defined below
            - @session.flash_bag

    your.session.attribute_bag:
        class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag

Ответ 3

Поскольку также возможно использовать компонент HTTPFoundation за пределами Symfony2, способ реализации NamespacedUserBags выглядит следующим образом:

use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;

$session = new Session();

//first bag
$myAttributeBag = new NamespacedAttributeBag('<your_storage_key_1>');
$myAttributeBag->setName('<your_tag_name_1>');
$session->registerBag($myAttributeBag);

//second bag
$myAttributeBag = new NamespacedAttributeBag('<your_storage_key_2>');
$myAttributeBag->setName('<your_tag_name_2>');
$session->registerBag($myAttributeBag);

$session->start();

Зарегистрируйте столько пакетов, сколько хотите, но обязательно сделайте это, прежде чем начинать сеанс. Теперь вы можете переключаться между сумками с помощью getBag():

$activeBag = $session->getBag('<your_tag_name>');

и получить доступ к пакету с именами с типичными методами:

$activeBag->set('tokens/a', 'adsf82983asd');
$activeBag->set('tokens/b', 'daslfl232l3k');

print_r($activeBag->get('tokens'));

Ответ 4

Начиная с Symfony 3, переопределение параметра session.attribute_bag.class больше не работает.

Решение, которое я применил после того, как немного потянул за волосы, использует проход компилятора для переопределения класса обслуживания session.attribute_bag.

Я сделал это непосредственно в Ядре, но проход внешнего компилятора работал бы так же.

SF4 Kernel

<?php
// src/Kernel.php
namespace App;

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;

class Kernel extends BaseKernel implements CompilerPassInterface
{
    use MicroKernelTrait;

    // ...

    public function process(ContainerBuilder $container)
    {
        $container->getDefinition('session.attribute_bag')->setClass(NamespacedAttributeBag::class);
    }
}

Ответ 5

В Symfony 4 (и Flex) используйте следующую конфигурацию для использования NamespacedAttributeBag:

# config/services.yaml
services:
  session.attribute_bag: 
    class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
  # ...