我创建了一个非常简单的依赖注入容器。我可以创建一个类的实例,方法是:
$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);