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它仍然会抛出错误,我也宁愿修复潜在的问题,而不仅仅是埋葬它.
您的依赖关系图中有一个循环:
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仅在访问时才加载依赖项,因此在调用构造函数时无需构建依赖项.
| 归档时间: |
|
| 查看次数: |
3533 次 |
| 最近记录: |