Как осуществляется грамотная передача объекта 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
В точке входа приложения создается контейнер.
Дальше первое и единственное место где должно быть обращение к контейнеру это, к примеру: $controller = $container->get(MyController::class)
Все остальное уже инжектится в нужный контроллер.
Пример, конечно, сильно утрирован, но смысл в том, что про контейнер зависимостей должен знать только 1 участок кода - точка входа.
Все остальное приложение не должно иметь представления о контейнере, и только должны получать зависимости.
Иначе приложение будет зависеть на конкретной реализации DI контейнера и в целом на каком-то контейнере. Контейнер это всего лишь инструмент для управления зависимостями, но не зависимость)
Так и сделал, а ещё использую orm eloquent, без ларавел, там создаю миграцию для создания таблиц в бд и запускаю в консоли php file_name.php
Вот тут никак не прокинешь контейнер, приходится создавать. И для unit тестов тоже свой контейнер.
В целом же для приложения протягивание из точки входа оптимальный вариант, причём инжектить можно не весь контейнер, а только необходимое, например в класс Db только $container['db_connection']