Skip to main content
Stack Overflow на русском

Timeline for answer to Dependency Injection Container by Konstantin Galiakhmetov

Текущая лицензия: CC BY-SA 4.0

Post Revisions

14 событий
когда сменить формат что кем лицензия комментарий
10 сент. 2019 в 18:16 комментарий добавлен человек мякоть @KonstantinGaliakhmetov я попробовал как вы и написали, поставить какой-то DI-контейнер и на его основе написать что-то. У меня все равно ничего не получилось: ru.stackoverflow.com/questions/1021666 помогите пожалуйста)
31 авг. 2019 в 20:15 комментарий добавлен Konstantin Galiakhmetov Что же касается статьи на тему Di вообще, не знаю, что посоветовать, насамом деле об этом очень много написано и легко гуглиться. По моему мнению, нужно просто взять туториал по какому-нибудь контейнеру, выполнить его, и написать unit тест для класса с зависимостями, тогда вам сразу станет очевидно какой смысл в DI и как оно работает.
31 авг. 2019 в 20:11 комментарий добавлен Konstantin Galiakhmetov Когда вы передаете нужные зависимости в конструктор, то четко контролируете, что ему нужно, т.е. увидив определение класса сразу можете сказать, что ему понадобиться и вы легко сможете его замокать, когда будете писать тесты. На эту тему на хабре недавно была статья: habr.com/ru/post/465395
31 авг. 2019 в 16:17 комментарий добавлен человек мякоть @KonstantinGaliakhmetov спасибо большое за ответы и пример! почему получение логгер из контейнера является антипаттерном ? Может посоветуете статьи или литературу, как бы я смог более детально разобраться с паттерном dependency injection и контейнерами ?
30 авг. 2019 в 15:11 история изменён Konstantin Galiakhmetov CC BY-SA 4.0
в текст добавлено 735 символов
30 авг. 2019 в 14:56 комментарий добавлен Konstantin Galiakhmetov Бывают моменты, когда так приходится сделать, но это скорее антипаттерн. В вашем примере Order должен получить Logger через конструктор, а чтобы получить доступ к контейнеру, что не самая лучшая практика, его тоже нужно получить через конструктор. Добавлю пример такого класса в ответ.
30 авг. 2019 в 13:48 комментарий добавлен sexy-shmexy Нужно в каждый класс, который использует сервис логирования, мне нужно через конструктор передавать $container ?
30 авг. 2019 в 13:47 комментарий добавлен sexy-shmexy Например в методе make класса Order, нужно добавить какую-то запись в логи. Насколько я понял из разных примеров работы с IoC контейнерами, то мне нужно получить сервис логгера, и добавить данные в лог. Т.е. так: $logger = $container["logger"]; $logger->log($message); Или я что-то не так понимаю ? Может так нельзя делать?
30 авг. 2019 в 13:00 комментарий добавлен Konstantin Galiakhmetov То есть все классы, которые вы получаете в Order создаются контейнером и передаются ордеру в конструктор, внутри order никакие сервисы не создаются, в том числе это верно и для самого контейнера. Думаю, чтобы лучше понять, вам нужно взять какой-то туториал по какому-то конкретному контейнеру и попытаться его выполнить, тут конкретика лучше абстракции.
30 авг. 2019 в 12:59 комментарий добавлен Konstantin Galiakhmetov А зачем вам в классе Order получать контейнер? Нужно представить эту ситуацию, вам в классе Order обычно контейнер не нужен, т.к. контейнер вы используете чтобы получить какие-то сервисы, но все сервисы будут инжектированы самим контейнером через конструктор в идеале, вам не нужен там контейнер, но если он вдруг будет нужен, то он может быть инжектирован через конструктор точно так же как и любой другой сервис, то есть у вас в конструкторе кроме всего прочего будет прописан и контейнер.
30 авг. 2019 в 12:49 голос принят sexy-shmexy
30 авг. 2019 в 12:46 комментарий добавлен sexy-shmexy Не совсем понимаю как в файле с классом будет доступен контейнер, который я создал и инициализировал в другом файле ? Нужно писать global $container; ? Или как ?
30 авг. 2019 в 12:46 комментарий добавлен sexy-shmexy Спасибо большое! Стало на много понятнее! Только один момент непонятен еще: например в единой точке входа в приложение, в файле bootstrap.php после подключения файла композера autoload.php я создаю DI-контейнер, например Pimple: <?php include '/../vendor/autoload.php'; $container = new Pimple(); // и тут же задаю в контейнер все сервисы и зависимости Далее мне нужно в классе Order, который в проект подключается через автозагрузчик использовать контейнер.
30 авг. 2019 в 12:35 история дан ответ Konstantin Galiakhmetov CC BY-SA 4.0

AltStyle によって変換されたページ (->オリジナル) /