Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Factory call from container config #350

Open
6elkir opened this issue Jan 29, 2024 · 3 comments
Open

Factory call from container config #350

6elkir opened this issue Jan 29, 2024 · 3 comments

Comments

@6elkir
Copy link

6elkir commented Jan 29, 2024

Надо чтобы из конфига контейнера можно было определять будет отдан синглтон (инстанс созданный ранее) или же создастся новый при каждом вызове 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
Copy link
Member

vjik commented Jan 29, 2024

It can to implemented via meta parameter:

'singleton' => false,

@6elkir
Copy link
Author

6elkir commented Jan 29, 2024

It can to implemented via meta parameter:

'singleton' => false,

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

@6elkir
Copy link
Author

6elkir commented Jan 30, 2024

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants