yiisoft/di

Factory call from container config

Opened this issue · 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 () {...})
];
что вернет новый инстанс, а не синглетон.

vjik commented

It can to implemented via meta parameter:

'singleton' => false,

It can to implemented via meta parameter:

'singleton' => false,

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

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

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