14

我正在尝试使用 symfony2 会话。我这样做

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

这行得通。但我想在会话中使用命名空间。文档说

    class NamespacedAttributeBag 

提供该功能,但我不知道如何实现它

4

5 回答 5

15

只需打开您的 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:
# ...
于 2012-11-06T11:51:31.120 回答
9

您应该重新定义会话服务并为您的属性包定义服务(如果您检查默认实现,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
于 2012-09-05T10:33:45.477 回答
4

因为也可以在 Symfony2 之外使用 HTTPFoundation 组件,所以实现 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'));
于 2014-11-02T16:23:15.610 回答
2

从 Symfony 3 开始,session.attribute_bag.class参数的覆盖不再起作用。

我拉了几次头发后应用的解决方案是使用编译器传递来覆盖session.attribute_bag服务类。

我直接在内核中完成了它,但是外部编译器传递也会以相同的方式工作。

SF4 内核

<?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);
    }
}
于 2018-04-25T13:48:22.093 回答
1

使用 Symfony 4(和 Flex),使用以下配置来使用NamespacedAttributeBag

# config/services.yaml
services:
  session.attribute_bag: 
    class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag
  # ...
于 2019-05-13T13:37:44.223 回答