2016-05-09 2 views
2

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

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

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

$user = new User(); 

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

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

ответ

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

Вам не нужно вводить в конструктор. Несколько способов инъекционные бы с помощью функции сеттер

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

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

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

Спасибо, но я не хочу делать это так либо иначе, как я должен изменить свой вызов, чтобы создать пользовательский экземпляр. В идеале мне нужен статический аксессор, но я не уверен, как это сделать, чтобы он делил те же экземпляры (хранящиеся как массив) внутри моего контейнера. – nfplee

Смежные вопросы