DI 容器的服务定位器

Service Locator for DI Container

我创建了一个非常简单的依赖注入容器。我可以通过以下语句创建 class 的实例:

$foo = $container->get(Foo::class);

这很好用,允许我在 Foo 的构造函数中注入依赖项。现在我想创建一个 class 的实例,方法是:

$user = new User();

我需要能够从用户 class 中的容器访问服务,但我不确定最好的方法。我想避免的两种方法是一种将容器传递给构造函数,第二种使用容器的 get 方法(如上所示)创建 Foo 的实例。

如果有人能告诉我实现此目标的正确方法,我将不胜感激。谢谢

您不必注入构造函数。有几种注入方式是通过 setter 函数

public function setUser(User $user) {
    $this->user = $user;
}

或者直接注入需要与class

交互的函数
public function someFunction(User $user) {
    $val = $user->doSomething();
}

我想出了一个巧妙的方法来做到这一点。首先,我向指向当前实例的容器添加了一个静态 属性 。例如:

class Container {
    protected static $instance;

    public function __construct() {
        static::$instance = $this;
    }

    ...
}

然后我所要做的就是创建一个静态获取方法,例如:

public static function getInstance($name) {
    return static::$instance->get($name);
}

很遗憾,它不能具有相同的名称。单击 here 以获取实现它的 hacky 方法。

现在我可以在我的用户 class 中说以下内容:

var foo = Container::getInstance(Foo::class);