gpt4 book ai didi

php - 在 Laravel 之外使用 Laravel 的容器

转载 作者:可可西里 更新时间:2023-10-31 23:17:48 28 4
gpt4 key购买 nike

为什么?

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

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

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

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

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

大部分。

如果该类对容器本身有依赖性(就像 Pipeline 一样),那么它会 barfs:

BindingResolutionException: Target [Illuminate\Contracts\Container\Container] is not instantiable

当然可以,Pipeline 需要一个契约(Contract),但没有连接。因此,让我们更新辅助方法来做到这一点:

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

return Container::getInstance();
}

但现在我得到:

Illegal offset type in isset or empty

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

知道如何在 Laravel 之外手动连接 Container,这样我就可以bind() 东西,并使用 Container 构建类和处理依赖项包括它自己?

最佳答案

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

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

关于php - 在 Laravel 之外使用 Laravel 的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903471/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com