di icon indicating copy to clipboard operation
di copied to clipboard

Factory call from container config

Open 6elkir opened this issue 1 year ago • 3 comments

Надо чтобы из конфига контейнера можно было определять будет отдан синглтон (инстанс созданный ранее) или же создастся новый при каждом вызове get.

Пример: Некий сервис требует другой класс (допустим дебагер для консоли) он должен всегда создаваться по новой иначе неправильно отображает инфу для модулей которые его вызывают. В итоге везде где стоит зависимость такого сервиса он отображается неправильно т.к. везде суется инстанса от первого вызова container->get. Нельзя совать вызов фабрики вовнутрь сервиса иначе мы их свяжем. Конечному объекту не нужно управлять контейнером, ему просто нужна зависимость, но указывать single/new надо где-то выше. Полагаю в конфиге контейнера.

Пример-2: Какой-нибудь билдер, мы хотим чтоб он каждый раз был новый, но при этом для создания самого билдера нужны какие-нибудь зависимости, которые хочется чтоб разрешил контейнер

В yii2 за это отвечали секции конфига container: singletons, instances, а вызов был всегда однотипен.

У конкурентов сделано так: https://php-di.org/doc/php-definitions.html#factories

return [ 'Database' => DI\factory(function () {...}) ]; что вернет новый инстанс, а не синглетон.

6elkir avatar Jan 29 '24 09:01 6elkir

It can to implemented via meta parameter:

'singleton' => false,

vjik avatar Jan 29 '24 11:01 vjik

It can to implemented via meta parameter:

'singleton' => false,

Как вариант да, я бы добавил еще возможность на кейс каллбака, когда параметров нет.

6elkir avatar Jan 29 '24 11:01 6elkir

Как вариант можно оборачивать definition в класс-обертку, к примеру DI\NoCache а сам дефинишн хранить внутри где-нибудь. В итоге в get можно сделать доп. проверку перед проверкой кэша if ( $definition instanceof NoCache ){resolve($definition->getNoCachedConfig():Difinition)}

Тогда это даст некоторую гибкость паковать не только массивы, но и callback

6elkir avatar Jan 30 '24 12:01 6elkir