在Laravel之外使用Laravel的容器

时间:2016-01-20 15:01:56

标签: php laravel laravel-5

为什么?

  1. 我正在尝试在独立的库中使用像Pipeline这样的其他一些Laravel作品,这需要容器。
  2. 使用容器到make()类上瘾,我想要自动构造函数依赖项处理(假设具体的,类型化的依赖项)。
  3. 所以我写了一个辅助方法:

    function container()
    {
      if(is_null(Container::getInstance())) {
          Container::setInstance(new Container());
      }
      return Container::getInstance();
    }
    

    如果在Laravel中使用此库,我不想与任何现有的帮助器方法冲突。通过检查现有的静态实例,我认为这将在Laravel内部或外部很好地发挥。

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

    晴。

    如果该类具有Container本身的依赖性(如Pipeline那样),则barfs:

      

    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来构建类并处理依赖包括它自己

1 个答案:

答案 0 :(得分:3)

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

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