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 |