如何在symfony会话

时间:2017-06-23 14:15:24

标签: php symfony session

我想在symfony会话中添加一个额外的包。

我在编译器传递中这样做:

public function process(ContainerBuilder $container)
{   
    $bag = new AttributeBag("my_session_attributes");

    $container->getDefinition("session")
        ->addMethodCall("registerBag", [$bag]);
}

但是我收到了一条消息的例外:

  
    

如果参数是对象或者是,则无法转储服务容器     资源。

  
     

这是跟踪堆栈:

     
      
  1. in XmlDumper.php第379行
  2.   
  3. at XmlDumper :: phpToXml(object(AttributeBag))in XmlDumper.php第328行
  4.   
  5. at XmlDumper-> convertParameters(array(object(AttributeBag)),' argument',object(DOMElement))in XmlDumper.php第94行
  6.   
  7. at XmlDumper-> addMethodCalls(array(array(' registerBag',array(object(AttributeBag)))),对象(DOMElement))在XmlDumper.php中   第183行
  8.   
  9. at XmlDumper-> addService(object(定义),' session',object(DOMElement))在XmlDumper.php第272行
  10.   
  11. at XmlDumper-> addServices(object(DOMElement))in XmlDumper.php第52行
  12.   
  13. 位于ContainerBuilderDebugDumpPass.php第34行的XmlDumper-> dump()
  14.   
  15. 在ContainerBuilderDebugDumpPass->进程(对象(ContainerBuilder))中   Compiler.php第104行
  16.   
  17. 在Compiler->编译(对象(ContainerBuilder))在ContainerBuilder.php第598行
  18.   
  19. 在ContainerBuilder->在Kernel.php第514行中的compile()
  20.   
  21. at Kernel->在kernel.php第133行中的initializeContainer()
  22.   
  23. at Kernel-> boot()in Kernel.php第182行
  24.   
  25. at app_dev.php第29行中的Kernel->句柄(对象(请求))
  26.   

如果我无法在服务定义中传递对象参数,我应该如何添加新包?

2 个答案:

答案 0 :(得分:2)

好的,在发布问题之后,我有一个想法,我认为这是一种解决方法,但它确实有效。

AttributeBag也必须注册为服务:

public function process(ContainerBuilder $container)
{   
    $bagDefinition = new Definition();
    $bagDefinition->setClass(AttributeBag::class);
    $bagDefinition->addArgument("my_session_attributes");
    $bagDefinition->addMethodCall("setName", ["my_session_attributes"]);
    $bagDefinition->setPublic(false);
    $container->setDefinition("my_session_attributes_service", $bagDefinition);

    $container->getDefinition("session")
        ->addMethodCall("registerBag", [new Reference("my_session_attributes_service")]);
}

答案 1 :(得分:0)

这件事在文档中不清楚,你的例子有点帮助,但我认为有一种更干净的方法来向 symfony 会话添加一个包,这就是我所做的(symfony 4+)

添加一个bag类,比如你可以扩展一个AttributeBag

namespace App\Tracking;
use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;    

class TrackingBag extends AttributeBag
{
    public function __construct(string $storageKey = 'trackings')
    {
        parent::__construct($storageKey);
        $this->setName($storageKey);
    }
}

然后添加一个CompilerPass

public function process(ContainerBuilder $container)
{
    $container->getDefinition("session")->addMethodCall(
        "registerBag",
        [new Reference('App\\Tracking\\TrackingBag')]
    );
}

然后你就可以像twig那样使用它

{{ app.session.bag('trackings').all }}

我仍然相信有更清洁的方法,但这是唯一对我有用的方法。