【问题标题】:Use Laravel's Container outside of Laravel在 Laravel 之外使用 Laravel 的容器
【发布时间】:2016-01-20 15:01:56
【问题描述】:

为什么?

  1. 我正在尝试在需要 Container 的独立库中使用其他 Laravel 部分,例如 Pipeline。
  2. 使用 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 来构建类和处理依赖项包括它自己

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    由于您要绑定到现有对象,请使用instance 方法:

    $container->instance('Illuminate\Contracts\Container\Container', $container);
    

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2014-11-08
      • 2015-07-27
      • 2015-05-21
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2016-07-19
      • 2015-03-15
      相关资源
      最近更新 更多