DI容器的服务定位器

时间:2016-05-09 19:44:30

标签: php dependency-injection service-locator

我创建了一个非常简单的依赖注入容器。我可以通过说:

创建一个类的实例
$foo = $container->get(Foo::class);

这很好用,允许我在Foo的构造函数中注入依赖项。现在我希望通过以下方式创建一个类的实例:

$user = new User();

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

如果有人能告诉我正确的方法,我会很感激。感谢

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

class Container {
    protected static $instance;

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

    ...
}

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

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

不幸的是它不能有相同的名字。点击here了解实现目标的方法。

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

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