Php 使用Laravel';拉雷维尔外的s集装箱

Php 使用Laravel';拉雷维尔外的s集装箱,php,laravel,laravel-5,Php,Laravel,Laravel 5,为什么? 我正在尝试使用其他一些Laravel片段,比如独立库中的管道,它需要容器 使用Container tomake()类会上瘾,我需要自动构造函数依赖项处理(假设具体的、类型提示的依赖项) 所以我写了一个助手方法: function container() { if(is_null(Container::getInstance())) { Container::setInstance(new Container()); } return Container::get

为什么?

  • 我正在尝试使用其他一些Laravel片段,比如独立库中的管道,它需要容器
  • 使用Container to
    make()
    类会上瘾,我需要自动构造函数依赖项处理(假设具体的、类型提示的依赖项)
  • 所以我写了一个助手方法:

    function container()
    {
      if(is_null(Container::getInstance())) {
          Container::setInstance(new Container());
      }
      return Container::getInstance();
    }
    
    如果这个库在Laravel中使用,我不想与任何现有的助手方法发生冲突。通过检查现有的静态实例,我认为这将在Laravel内部或外部很好地发挥作用

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

    大部分

    如果该类对容器本身有依赖关系(就像管道一样),那么它会:

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

    当然,好的,管道需要一份合同,但没有连接。因此,让我们更新helper方法来实现这一点:

    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之外手动连接容器,这样我就可以
    bind()
    东西,并使用容器来构建类和处理依赖关系,包括它本身吗?

    既然您要绑定到现有对象,请使用
    实例
    方法:

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