Я создал очень простой контейнер для инъекций зависимостей. Я могу создать экземпляр класса, сказав:
$foo = $container->get(Foo::class);
Это хорошо работает и позволяет мне вводить зависимости в конструктор Foo. Теперь я хочу создать экземпляр класса, сказав:
$user = new User();
Мне нужно иметь доступ к сервису из контейнера в классе User, но я не уверен, что это лучший способ сделать это. Два способа, которые я бы хотел избежать, — это передать контейнер в конструктор и, во-вторых, использовать метод get контейнера, как показано выше, для создания экземпляра Foo.
Я был бы признателен, если бы кто-нибудь показал мне правильный путь для достижения этой цели. Спасибо
Вам не нужно вводить в конструктор. Пара способов ввода будет через функцию установки
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);