@knowledge

Как осуществляется грамотная передача объекта DI в конструктор?

Решил попробовать использовать dependency injection в своем приложении и тут возникла проблема

У меня есть front controller, файл index.php, там я создаю экземпляр контейнера (в частности pimple) и передаю в запускаемое приложение

$di = new Pimple\Container():
$di['config'] = require_once __DIR__.'config.php':

$app = new Application($di):
$app->run():

И все супер, заинжектилось.
Далее у меня есть класс контроллер, со своим неймспейсом. Как мне инжектить в этом случае, создавать объект di снова?

$di = new Pimple\Container():
new PostController($di):

В таком случае файл config будет считан повторно, точнее конструкция require_once не даст его считать, возвратив единицу, а моя цель использовать конфиги как синглтон, что собственно у меня и реализовано, но сейчас нужно сделать через dependency injection
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 1
artem90
@artem90
TeamLead, Developer
Докину в кучу ответов:

В точке входа приложения создается контейнер.
Дальше первое и единственное место где должно быть обращение к контейнеру это, к примеру:
$controller = $container->get(MyController::class)

Все остальное уже инжектится в нужный контроллер.

Пример, конечно, сильно утрирован, но смысл в том, что про контейнер зависимостей должен знать только 1 участок кода - точка входа.
Все остальное приложение не должно иметь представления о контейнере, и только должны получать зависимости.
Иначе приложение будет зависеть на конкретной реализации DI контейнера и в целом на каком-то контейнере. Контейнер это всего лишь инструмент для управления зависимостями, но не зависимость)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы