如何在Symfony2中使用Namespaced Sessions

时间:2012-09-05 10:19:37

标签: php symfony

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

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

这很有效。但我想在会话中使用命名空间。文档说

    class NamespacedAttributeBag 

提供该功能,但我无法弄清楚如何实现它

5 个答案:

答案 0 :(得分: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:
# ...

答案 1 :(得分:9)

您应该重新定义会话服务并为您的属性包定义服务(如果您检查session.attribute_bag的默认实现,您将看到此服务只有class属性)。

将新服务注入重新定义的会话服务

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

答案 2 :(得分: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'));

答案 3 :(得分:2)

从Symfony 3开始, var submittedData = new FormData($('form')[0]); submittedData.append('stripe_key', stripe_key_value); $.ajax({ url: "/register", type: "post", data: submittedData, cache: false, contentType: false, processData: false, beforeSend: function() { $('#cover').show(); }, success: function(response) { $('#cover').hide(); return true; } }); 参数的覆盖不再起作用。

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

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

SF4内核

session.attribute_bag

答案 4 :(得分:0)

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

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