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

Tom*_*een 3 php dependency-injection circular-dependency laravel laravel-4

我正在开发一个相当大的Laravel项目并使用Repositories.

我有一个用户存储库,它注入其依赖关系,如下所示:

public function __construct(CartRepository $cartRepo...)
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

Maximum function nesting level of '100' reached, aborting!
Run Code Online (Sandbox Code Playgroud)

我认为这是因为CartRepo注入一个ItemRepo,然后注入UserRepo,导致无限的嵌套循环.

我没有得到的是如何找到这个,ItemRepo需要UserRepo,因为项目绑定到用户?

有没有人遇到过这个?如果是这样你怎么解决它?

我知道我可以增加xdebug.max_nesting_level但是即使值为750它仍然会抛出错误,我也宁愿修复潜在的问题,而不仅仅是埋葬它.

Mat*_*oli 5

您的依赖关系图中有一个循环:

UserRepo -> CartRepo -> ItemRepo -> UserRepo -> …
Run Code Online (Sandbox Code Playgroud)

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

我很惊讶Laravel DI容器没有抛出显式异常.

您必须重新考虑服务/存储库之间的依赖关系,可能通过将一些类拆分为更小,更少耦合的对象.


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

  • 塞特犬注射

您可以将它注入到setter中,而不是在构造函数中注入依赖项,该setter将在构造对象后调用.在伪代码中,看起来像这样:

$userRepo = new UserRepository();
$cartRepo = new CartRepository($userRepo);
$userRepo->setCartRepo($userRepo);
Run Code Online (Sandbox Code Playgroud)
  • 懒惰注射

我不知道Laravel是否支持延迟注入,但这也是一个解决方案:容器将注入代理对象而不是实际依赖.该proxy-object仅在访问时才加载依赖项,因此在调用构造函数时无需构建依赖项.