在 Laravel 之外使用 Laravel 的容器

jsz*_*ody 5 php laravel laravel-5

为什么?

  1. 我正在尝试在需要 Container 的独立库中使用其他一些 Laravel 部分,例如 Pipeline。
  2. 使用 Container 到make()类是令人上瘾的,我想要自动构造函数依赖处理(假设具体的、类型提示的依赖)。

所以我写了一个辅助方法:

function container()
{
  if(is_null(Container::getInstance())) {
      Container::setInstance(new Container());
  }
  return Container::getInstance();
}
Run Code Online (Sandbox Code Playgroud)

如果在 Laravel 中使用了这个库,我不想与任何现有的辅助方法发生冲突。通过检查现有的静态实例,我认为这在 Laravel 内部或外部都可以很好地发挥作用。

这有效!我可以做到container()->make(SomeClass::class),它会自动构建和注入构造函数依赖项。

大多。

如果该类对 Container 本身有依赖性(就像 Pipeline 那样),那么它会发出:

BindingResolutionException:目标 [Illuminate\Contracts\Container\Container] 不可实例化

当然,好的,Pipeline 需要一份未连接的合同。所以让我们更新辅助方法来做到这一点:

function container()
{
    if(is_null(Container::getInstance())) {
        $container = new Container();
        $container->bind('Illuminate\Contracts\Container\Container', $container);
        Container::setInstance($container);
    }

    return Container::getInstance();
}
Run Code Online (Sandbox Code Playgroud)

但现在我得到:

isset 或 empty 中的非法偏移类型

堆栈跟踪显示来自 Container.php 的一堆行号。

知道我如何在 Laravel 之外手动连接 Container,以便我可以然后bind()使用 Container 构建类并处理包括自身在内的依赖项吗?