我想在symfony会话中添加一个额外的包。
我在编译器传递中这样做:
public function process(ContainerBuilder $container)
{
$bag = new AttributeBag("my_session_attributes");
$container->getDefinition("session")
->addMethodCall("registerBag", [$bag]);
}
但是我收到了一条消息的例外:
如果参数是对象或者是,则无法转储服务容器 资源。
这是跟踪堆栈:
- in XmlDumper.php第379行
- at XmlDumper :: phpToXml(object(AttributeBag))in XmlDumper.php第328行
- at XmlDumper-> convertParameters(array(object(AttributeBag)),' argument',object(DOMElement))in XmlDumper.php第94行
- at XmlDumper-> addMethodCalls(array(array(' registerBag',array(object(AttributeBag)))),对象(DOMElement))在XmlDumper.php中 第183行
- at XmlDumper-> addService(object(定义),' session',object(DOMElement))在XmlDumper.php第272行
- at XmlDumper-> addServices(object(DOMElement))in XmlDumper.php第52行
- 位于ContainerBuilderDebugDumpPass.php第34行的XmlDumper-> dump()
- 在ContainerBuilderDebugDumpPass->进程(对象(ContainerBuilder))中 Compiler.php第104行
- 在Compiler->编译(对象(ContainerBuilder))在ContainerBuilder.php第598行
- 在ContainerBuilder->在Kernel.php第514行中的compile()
- at Kernel->在kernel.php第133行中的initializeContainer()
- at Kernel-> boot()in Kernel.php第182行
- at app_dev.php第29行中的Kernel->句柄(对象(请求))
醇>
如果我无法在服务定义中传递对象参数,我应该如何添加新包?
答案 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 }}
我仍然相信有更清洁的方法,但这是唯一对我有用的方法。