我有一个简单的类,如下所示:
<?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
,但我到底做错了什么?
这通常发生在类相互注入依赖关系时,因此循环引用。
给出上述示例,您的类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;
}
}
你有几个选择:
我们很难为您解决这一问题,因为这取决于您如何构建应用程序。
很明显,您正在将服务A注入服务B,并且将服务B注入服务A。这样做似乎不合逻辑,但有时是必要的。就我而言,我有两项服务:
_迷思-
_我的客户-
我使用我的会话来存储这些凭据,因为它将对整个系统可用,但是,要使用我的客户端获取这些凭据,我需要一些信息存储到我的会话......看,两个需要彼此工作的服务...
我开始看到这一切
检测到服务的循环引用
刚刚升级到Symfony 5。sfy5本身也提出了解决方案:
composer require symfony/proxy-manager-bridge
请记住,服务可以设置为
lazy : true
关于Symfony文档的更多信息
正如一些人指出的那样,循环依赖性来自这样一个事实,即您试图将计算器注入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” (这是意料之中的)