DI容器的服务定位器


Service Locator for DI Container

我创建了一个非常简单的依赖注入容器。我可以创建一个类的实例,方法是:

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

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

$user = new User();

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

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

您不必注入构造函数。注入的两种方法是通过setter函数

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

或者,您可以直接注入到需要与类交互的函数中

public function someFunction(User $user) {
    $val = $user->doSomething();
}

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

class Container {
    protected static $instance;
    public function __construct() {
        static::$instance = $this;
    }
    ...
}

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

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

不幸的是,它不能有相同的名称。点击这里获取一种实现它的方法。

现在我可以在我的User类中说以下内容:

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