Сервисный локатор для DI-контейнера

Я создал очень простой контейнер для инъекций зависимостей. Я могу создать экземпляр класса, сказав:

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

Это хорошо работает и позволяет мне вводить зависимости в конструктор Foo. Теперь я хочу создать экземпляр класса, сказав:

$user = new User();

Мне нужно иметь доступ к сервису из контейнера в классе User, но я не уверен, что это лучший способ сделать это. Два способа, которые я бы хотел избежать, — это передать контейнер в конструктор и, во-вторых, использовать метод get контейнера, как показано выше, для создания экземпляра Foo.

Я был бы признателен, если бы кто-нибудь показал мне правильный путь для достижения этой цели. Спасибо

2

Решение

Вам не нужно вводить в конструктор. Пара способов ввода будет через функцию установки

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

Или вы можете ввести непосредственно в функцию, которая должна взаимодействовать с классом

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

Другие решения

Я придумал аккуратный способ сделать это. Сначала я добавил статическое свойство в свой контейнер, которое указывает на текущий экземпляр. Например:

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);
0

По вопросам рекламы [email protected]