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

检测到服务的循环引用

韩淇
2023-03-14

我有一个简单的类,如下所示:

<?php
namespace App\Algorithm;

use App\Dao\MatchDao;
use App\Service\MatchService;

class Calculator {
    private $users;
    private $matchDao;

    function __construct(MatchService $matchService, MatchDao $matchDao) {
        $this->users = $matchService->users;
        $this->matchDao = $matchDao;
    }

    public function hourlyRate() {
        $query = $this->matchDao->getSingleColumn('Payment', 'hourly_rate', 32);
        var_dump($query);
    }
}

但我收到以下错误消息:

检测到服务“App\Algorithm\Calculator”的循环引用,路径:“App\Algorithm\Calculator”-

MatchService.php

<?php
namespace App\Service;

use App\Algorithm\Calculator;
use App\Algorithm\Collection;

class MatchService {
    public $users;
    private $collection;
    private $calculator;

    function __construct(Collection $collection, Calculator $calculator) {
        $this->collection = $collection;
        $this->calculator = $calculator;
    }

    public function getMatch($data) {
        $this->users = $this->collection->getAllUsers($data);
        $this->calculator->hourlyRate();
        return 1;
    }

}

问题是MatchService,但我到底做错了什么?

共有3个答案

欧阳睿范
2023-03-14

这通常发生在类相互注入依赖关系时,因此循环引用。

给出上述示例,您的类MatchService注入集合计算器。其中一个(假设calculator作为集合可能是一个条令类)依赖注入您的MatchService

以下是我对你们的课程的看法:

class MatchService 
{
    public $users;
    private $collection;
    private $calculator;

    public function __construct(Collection $collection, Calculator $calculator) {
        $this->collection = $collection;
        $this->calculator = $calculator;
    }
}

class Calculator
{
    private $matchService;

    public function __construct(MatchService $matchService)
    {
        $this->matchService = $matchService;
    }
}

你有几个选择:

  • 更多的服务具有更少的依赖性
  • 使用静力学

我们很难为您解决这一问题,因为这取决于您如何构建应用程序。

祁宝
2023-03-14

很明显,您正在将服务A注入服务B,并且将服务B注入服务A。这样做似乎不合逻辑,但有时是必要的。就我而言,我有两项服务:

_迷思-

_我的客户-

我使用我的会话来存储这些凭据,因为它将对整个系统可用,但是,要使用我的客户端获取这些凭据,我需要一些信息存储到我的会话......看,两个需要彼此工作的服务...

我开始看到这一切

检测到服务的循环引用

刚刚升级到Symfony 5。sfy5本身也提出了解决方案:

composer require symfony/proxy-manager-bridge

请记住,服务可以设置为

lazy : true

关于Symfony文档的更多信息

佟阳云
2023-03-14

正如一些人指出的那样,循环依赖性来自这样一个事实,即您试图将计算器注入MatchService,同时将MatchService注入计算器。在创建另一个之前,无法创建一个。

看起来更深入一点,似乎计算器正在使用匹配服务来获取用户列表。第二个问题是,计算器试图在匹配服务生成用户之前获取用户。

这里有一个可能的重构:

class Calculator
{
    private $matchDao;

    public function __construct(MatchDao $matchDao)
    {
        $this->matchDao = $matchDao;
    }
    public function getHourlyRate($users) // Added argument
    {
        $query = $this->matchDao->getSingleColumn('Payment', 'hourly_rate', 32);
    }
}
class MatchService
{
    private $collection;
    private $calculator;

    public function __construct(Collection $collection, Calculator $calculator)
    {
        $this->calculator = $calculator;
        $this->collection = $collection;
    }
    public function getMatch($data)
    {
        $users = $this->collection->getAllUsers($data);
        $this->calculator->getHourlyRate($users);
    }
}

从计算器的构造函数中删除MatchService可以解决循环依赖性问题。将$users传递给getHourlyRate可以解决在用户可用之前尝试获取用户的问题。

这当然只是一个可能的解决方案。从您发布的代码中不清楚计算器是否真的需要$users。

 类似资料:
  • 问题内容: 我有下表: 存储在其中的实体是按层次结构组织的:如果存在一行,则认为该行是任何内容的“子项” 。由于项目不能从其自身衍生而来,因此我想将存在循环层次序列的行为定为非法: 我该怎么做呢? 另外,我可以在表中添加一个表示层次结构中“级别”的字段: 然后,我要求将其设置为when ,否则。 我正在使用SQL Server 2008 R2。 问题答案: 为了检查循环引用,我使用了触发器和递归C

  • 问题内容: 我尝试序列化从实体数据模型.edmx自动生成的POCO类,使用时 我收到以下错误: 错误检测到类型为System.data.entity的自引用循环。 我该如何解决这个问题? 问题答案: 那是最好的解决方案 https://code.msdn.microsoft.com/Loop-Reference-handling-in- caaffaf7 (我选择/尝试了这个,还有很多其他选择)

  • 目前我正在用这个样本进行拓扑排序,并对https://www.geeksforgeeks.org/topological-sorting/做了一些修改 我用它来排序要求解的变量的顺序。 样本 每个变量都有一个唯一整数,并存储在一个映射中 创建图形并添加边时,总共有4个顶点,因此我的代码将像这样构造图形 排序并按相反顺序得到结果后,它是正确的c 一切都很好,但我需要检测图中的循环引用。假设变量是 有

  • 我读过关于命名空间属性的文章。我尝试使用此功能: 它工作得很好。 作为一项改进,我希望覆盖会话服务,因此它将在任何地方使用,并使用依赖注入,而不是将会话服务耦合到addProduct函数中。 为此,我编辑了我的services.yaml 然后我更新CartController: 现在我得到了以下错误消息: 检测到服务“会话”的循环引用,路径:“会话”- 这个错误应该在这个问题上得到解决:#3626

  • 我有两个服务组件:PromiseService。服务ts(处理延迟调用和异步调用) 和员工ervice.service.ts(处理员工信息) 但是,我得到了以下错误: 检测到循环依赖关系:员工ervice.service.ts- 我试图更改Promise Service组件并删除以下行: 但是,出现了另一个错误:未处理的promise拒绝:无法读取未定义的属性“updateid”;区域:;任务:p

  • 假定我在一个大的JavaScript对象中有一个循环引用 浏览器抛出 “TypeError:将循环结构转换为JSON” (这是意料之中的)