170 похожих чатов

Привет. Вопрос на тему внедрения зависимостей. Есть консольное приложение и

есть консольная команда. В ней мне нужны репозиторий и http-клиент. Эти зависимости я хотел бы внедрить через конструктор (да или хоть через сеттер, не суть). И есть ещё конфигурация приложения. Это глобальная зависимость, внедрение которой не кажется верным ни через конструктор, ни через сеттер, потому что она не относится к этой консольной команде и в идеале я хотел бы иметь к ней доступ отовсюду. Но и пробрасывать контейнер в команду не кажется верным, согласно документации и здравому смыслу, в приложении должно быть как можно меньше точек зависимостей от контейнера. Очень долго думаю, как этот вопрос решить правильно. Кажется логичной идея использовать на всех классах, где нужен конфиг, сеттер, чтобы установить конфиг. Но тогда я сталкиваюсь с проблемой DRY (везде имплементирую тот же интерфейс или наследую везде тот же базовый класс, или подключаю трейт). Получше пока ничего не придумал. Как вы решаете этот вопрос в своих проектах?

14 ответов

8 просмотров

консольная команда - это инфраструктурный уровень. там доменного кода быть не должно.

Посмотри в симфе класс контроллера как сделан, и все поймешь )

Владислав-Субботин Автор вопроса
Maxim Kainov
Посмотри в симфе класс контроллера как сделан, и в...

Да я смотрел, сам даже повторял. Доступ к контейнеру из контроллера есть, потому что он реализует ContainerAwareInterface. Так вот, это плохая идея, везде давать юзать контейнер.

Владислав-Субботин Автор вопроса
Maxim Kainov
Нет

Что именно "нет"?

Владислав Субботин
Что именно "нет"?

Ты инъектишь Psr\Container\ContainerInterface;

Владислав-Субботин Автор вопроса
Maxim Kainov
Ты инъектишь Psr\Container\ContainerInterface;

https://github.com/symfony/symfony/blob/5.x/src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php#L67

Владислав Субботин
https://github.com/symfony/symfony/blob/5.x/src/Sy...

Так ты зависишь от интерфейса, абстракции, тем более psr

Владислав-Субботин Автор вопроса
Maxim Kainov
Так ты зависишь от интерфейса, абстракции, тем бол...

Ну и что. В любом случае, чем меньше ты завязан на взаимодействие с контейнером, тем твой код чище. О чём и написано в доке.

Владислав Субботин
Ну и что. В любом случае, чем меньше ты завязан на...

Где написано? Если ты сам контейнер передаешь, то да, если абстракцию, то норм

Владислав-Субботин Автор вопроса
Maxim Kainov
Где написано? Если ты сам контейнер передаешь, то ...

https://symfony.com/doc/current/components/dependency_injection.html#avoiding-your-code-becoming-dependent-on-the-container

Владислав Субботин
https://symfony.com/doc/current/components/depende...

Это говорится о public сервисах, видимо. Там да, не понятно что ты откуда достаешь. А здесь ты явно прописываешь сервисы.

Конфиг нужен примерно нигде. Любой класс конфигурируется в контейнере, и инжектится тот, который укажешь. Если надо 2 разных варианта одного класса - делаешь в контейнере алиасы с разными параметрами. И инжектишь какой куда надо. Вот и вся магия. Если юзаешь уии, то тут помочь нечем, контейнер очень и очень говенный и не умеет почти ничего. Симфонивский в этом плане намного мощнее и дает возможность реализовать почти любые хотелки.

Владислав-Субботин Автор вопроса
The Ant 🐜
Конфиг нужен примерно нигде. Любой класс конфигури...

Нет, вообще пока без фреймворка. Пробую на чистом пхп с подключением любого модуля, который придётся по вкусу. Кажется, так и буду делать.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта