当前位置: 首页 > 知识库问答 >
问题:

检测到服务“会话”的循环引用,路径:“会话->会话.flash\u包->会话”

鲁丰
2023-03-14

我读过关于命名空间属性的文章。我尝试使用此功能:

#src/Controller/CartController.php
public function addProduct(int $cart_id, int $product_id, Request $request, SessionManager $sessionManager)
{
   $session = new Session(new NativeSessionStorage(), new NamespacedAttributeBag());
   $session->set("cart_$cart_id/product_$product_id", $request->get('selected_product_qty'));
   dump($session);
   die();
}

它工作得很好。

作为一项改进,我希望覆盖会话服务,因此它将在任何地方使用namespacedattributebag,并使用依赖注入,而不是将会话服务耦合到addProduct函数中。

为此,我编辑了我的services.yaml

#config/services.yaml
    session:
        public: true
        class: Symfony\Component\HttpFoundation\Session\Session
        arguments: ['@session.storage', '@session.namespacedattributebag']

    session.namespacedattributebag:
        class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag

然后我更新CartController:

public function addProduct(int $cart_id, int $product_id, Request $request, Session $session)
{
   $session->set("cart_$cart_id/product_$product_id", $request->get('selected_product_qty'));
   dump($session);
   die();
}

现在我得到了以下错误消息:

检测到服务“会话”的循环引用,路径:“会话”-

这个错误应该在这个问题上得到解决:#36261这里已经讨论过了。

但对我来说,问题仍然存在。。。(我正在使用Symfony 5.1)

共有1个答案

子车青青
2023-03-14

我不能提供更多的解释(不幸的是),但是如果出现这个问题,你必须明确地定义会话构造函数的第三个(和可选参数):

#config/services.yaml
session:
    public: true
    class: Symfony\Component\HttpFoundation\Session\Session
    arguments: ['@session.storage', '@session.namespacedattributebag', '@session.flash_bag']

session.namespacedattributebag:
    class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag

我认为这是因为以下代码

#src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/SessionPass.php
foreach ($container->getDefinition('session')->getArguments() as $v) {
    if (!$v instanceof Reference || !isset($bags[$bag = (string) $v]) || !\is_array($factory = $bags[$bag]->getFactory())) {
        continue;
    }

    if ([0, 1] !== array_keys($factory) || !$factory[0] instanceof Reference || 'session' !== (string) $factory[0]) {
        continue;
    }

    if ('get'.ucfirst(substr($bag, 8, -4)).'Bag' !== $factory[1]) {
        continue;
    }
    $bags[$bag]->setFactory(null);
}

如果您调试它,您将看到:

dump($bags);
foreach($container->getDefinition('session')->getArguments() as $v){...}
dump($bags);

让你的配置像这样:

#config/services.yaml
...
arguments: ['@session.storage', '@session.namespacedattributebag', '@session.flash_bag']
...

您将注意到调试显示:

"session.flash_bag" => Symfony\Component\DependencyInjection\Definition {#2253 ▼
    -class: "Symfony\Component\HttpFoundation\Session\Flash\FlashBag"
    -file: null
    -factory: array:2 [▶]

对于输入服务定义flash_bag然后在输出(第二个转储()):

"session.flash_bag" => Symfony\Component\DependencyInjection\Definition {#2253 ▼
    -class: "Symfony\Component\HttpFoundation\Session\Flash\FlashBag"
    -file: null
    -factory: null

工厂参数为空。

所以我想在这种情况下,没有创建flash_bag对象,因此,没有循环引用...

我无法再解释了。

另外,Symfony公司的一位员工说:@warslett于3月28日发表了评论

@ekosogin实际上不需要@session.flash\u bag参数。您应该能够做到这一点:

session:
    class: Symfony\Component\HttpFoundation\Session\Session
    arguments:
        - '@session.storage'
        - '@Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag'
Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag:
~```

但事实上,我认为这是错误的,因为如果你不按照他说的那样设置@session.flash\u bag参数,它将不起作用。

希望会有帮助。

 类似资料:
  • 我需要一起处理相同的消息集,为此,我尝试了Azure服务总线会话启用功能。为了测试这一点,我创建了一个非常简单的应用程序,一个消息在队列中成功提交,然而,当试图在“ReceiveSessionMessage”函数中接收消息时,消息会话不会返回,程序会在这一行之后退出。 我无法找出确切的根本原因,任何帮助都将不胜感激。谢谢 等待会话客户端。AcceptMessageSessionAsync();]

  • Django 提供对匿名会话的完全支持。其会话框架让你根据各个站点的访问者存储和访问任意数据。它在服务器端存储数据并抽象Cookie 的发送和接收。Cookie 包含会话的ID —— 不是数据本身(除非你使用基于Cookie 的后端)。 启用会话 会话是通过一个中间件实现的。 为了启用会话功能,需要这样做: 编辑MIDDLEWARE_CLASSES 设置并确保它包含'django.contrib.

  • 会话(Cookie)查询与修改操作类 进程: 主进程​ 1 const {session} = require('electron') 2 //查询所有Cookie。 3 session.defaultSession.cookies.get({}, (error, cookies) => { 4 console.log(error, cookies) 5 }) 6 //查询与特定网址相关联的所有C

  • 分布式的 servlet 容器必须支持 Java EE 实现机制所必需的其他 Java EE 对象从一个 JVM 迁移到另一个。

  • 超文本传输协议(HTTP)被设计为一种无状态协议。为构建有效的 Web 应用,使来自一个特定的客户端的请求彼此相关联是必要的。随时间的推移,演变了许多会话跟踪机制,这些机制直接使用对程序员而言是困难或麻烦的。 该规范定义了一个简单的 HttpSession 接口,允许 servlet 容器使用几种方法来跟踪用户会话,而不会使应用开发人员陷入到这些方法的细节中。

  • 会话功能的开启,首先要配置hi-nginx。如下所示: userid on; userid_name SESSIONID; userid_domain localhost; userid_path /; userid_expires 5m; hi_need_cookies on; hi_need_session on; 特别要注意的是,us