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

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

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

14 ответов

3 просмотра

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

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

Владислав-Субботин Автор вопроса
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 🐜
Конфиг нужен примерно нигде. Любой класс конфигури...

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта