gpt4 book ai didi

php - 自引用模型导致 Laravel 4 中 x 的最大函数嵌套级别

转载 作者:搜寻专家 更新时间:2023-10-31 20:42:01 25 4
gpt4 key购买 nike

我正在处理一个相当大的 Laravel 项目,并且正在使用 Repositories。

我有一个用户存储库,它像这样注入(inject)它的依赖项:

public function __construct(CartRepository $cartRepo...)

这会导致以下错误:

Maximum function nesting level of '100' reached, aborting!

我认为这是因为 CartRepo 注入(inject)了一个 ItemRepo,而 ItemRepo 又注入(inject)了 UserRepo,导致无限嵌套循环。

我不明白的是如何解决这个问题,ItemRepo 需要 UserRepo,因为项目与用户相关联?

有没有人遇到过这个?如果是这样,您是如何解决的?

我知道我可以增加 xdebug.max_nesting_level 但即使值为 750 它仍然会引发错误,我也宁愿解决潜在的问题而不是埋葬它。

最佳答案

你的依赖图中有一个循环:

UserRepo -> CartRepo -> ItemRepo -> UserRepo -> …

你无法解决这个问题。这是一个无限循环,xdebug.max_nesting_level 帮不了您。

令我惊讶的是 Laravel DI 容器没有抛出显式异常。

您必须重新考虑服务/存储库之间的依赖关系,也许可以将一些类拆分为更小、耦合度更低的对象。


更新:糟糕,我忘记了几个解决方案!

  • 二传手注入(inject)

与其在构造函​​数中注入(inject)依赖项,不如将其注入(inject)到 setter 中,它会在对象构造完成后调用。在伪代码中,它看起来像这样:

$userRepo = new UserRepository();
$cartRepo = new CartRepository($userRepo);
$userRepo->setCartRepo($userRepo);
  • 惰性注入(inject)

我不知道 Laravel 是否支持惰性注入(inject),但这也是一种解决方案:容器将注入(inject)一个代理对象而不是实际的依赖项。该代理对象仅在访问时加载依赖项,因此无需在调用构造函数时构建依赖项。

关于php - 自引用模型导致 Laravel 4 中 x 的最大函数嵌套级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19909138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com