【发布时间】:2016-01-20 15:01:56
【问题描述】:
为什么?
- 我正在尝试在需要 Container 的独立库中使用其他 Laravel 部分,例如 Pipeline。
- 使用 Container 到
make()类令人上瘾,我想要自动构造函数依赖处理(假设具体的、类型提示的依赖项)。
于是我写了一个辅助方法:
function container()
{
if(is_null(Container::getInstance())) {
Container::setInstance(new Container());
}
return Container::getInstance();
}
如果在 Laravel 中使用这个库,我不想与任何现有的辅助方法发生冲突。通过检查现有的静态实例,我认为这将在 Laravel 内部或外部很好地发挥作用。
这行得通!我可以做container()->make(SomeClass::class),它会自动构建和注入构造函数依赖项。
大部分时间。
如果该类对 Container 本身有依赖关系(就像 Pipeline 那样),那么它会出错:
BindingResolutionException:目标 [Illuminate\Contracts\Container\Container] 不可实例化
当然,好的,管道需要一个未连接的合同。所以让我们更新帮助方法来做到这一点:
function container()
{
if(is_null(Container::getInstance())) {
$container = new Container();
$container->bind('Illuminate\Contracts\Container\Container', $container);
Container::setInstance($container);
}
return Container::getInstance();
}
但现在我明白了:
isset 中的非法偏移类型或为空
堆栈跟踪显示了 Container.php 中的一堆行号。
知道如何在 Laravel 之外手动连接 Container,这样我就可以 bind() 事物,并使用 Container 来构建类和处理依赖项包括它自己?
【问题讨论】: