@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 контейнера и в целом на каком-то контейнере. Контейнер это всего лишь инструмент для управления зависимостями, но не зависимость)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
04 мая 2024, в 22:17
12000 руб./за проект
04 мая 2024, в 22:17
10000 руб./за проект
04 мая 2024, в 22:14
2000 руб./за проект