Не смеши людей. Это ты свою CMS обозвал типовым сценарием? Ржу в голос. Внедрение через публичные свойства, сервис-локатор, куча фабрик на любой малейший чих... Это только то, что успел увидеть, пока конфигу заводил.
Это не типовой сценарий, а спагетти код на уровне ооп, астронавтика с перелиньковкой зависимостей и самолюбование сплошное, смотрите как я крут, все паттерны знаю. Порадовал старика :lol: :lol: :lol:
Ну да ладно, мне до этого дела нет. Я понимаю, что это легаси с тех времен, когда ты контейнер воспринимал исключительно как сервис-локатор. Да и еще раз спасибо за интеграционный тест, редко где можно найти такую тяжелую неразбериху, настоящее испытание для контейнера.
Мне интересно другое, ты вот нифига не понял, как юзать мою поделку, и пытаешься свалить свою некомпетентность на мой контейнер. Крутишься, как уж на сковородке. Пимпл притащил, PHP DI.
На вот сравнивай с пимплом для начала:
$container->add('service', function () {
return new TestEntryAsService;
});
$container->add('a', function () {
$factoryEntry = new TestEntryAsFactory;
$factoryEntry->service = $this->get('service');
return $factoryEntry;
});
for ($i = 0; $i < 10; $i++) {
$container->getNew('a')->test();
}
Синтаксис лаконичнее, а главное однозначный. Не нужно думать куда что обернуть.
Хочешь получи как сервис, хочешь, как новый объект. И где тут протечка?
А теперь сравнивай с PHP DI
$container->add([
'service' => TestEntryAsService::class,
'a' => TestEntryAsFactory::class,
]);
$container->addDependences('a', ['service' => $container->get('service')]);
for ($i = 0; $i < 10; $i++) {
$container->getNew('a')->test();
}
Та же песня. Используется всего три метода, синтаксис чище и прозрачнее. По крайней мере видно, в какой аргумент внедряем. И где тут протечка? Кроме того, я могу завернуть вызов сервиса в замыкание и будет ленивая загрузка. В твоем примере объект сервиса инициализируется сразу, нужен он или нет.
Не знаю, можно ли там по другому, но что ты показал не есть хорошо.
Причем заметь, мой контейнер умеет и как пимпл, и как PHP DI, два в одном, а синтаксис прозрачнее в обоих случаях.
Я тебе больше скажу, он еще вот так может:
$map = [
'service' => TestEntryAsService::class,
'a' => [
TestEntryAsFactory::class,
'service' => function () {
return $this->get('service');
}
]
];
$container->add($map);
for ($i = 0; $i < 10; $i++) {
$container->getNew('a')->test();
}
Это если вдруг возникнет желание сравнить его со своим говнокодом со звездочками, и где (о боже!) по умолчанию все зависимости сервисные. Это додуматься надо было. Собрал в одну кучу все возможные недостатки и считаешь, что это правильно. Покажи, где это так, у кого?
Так что давай, делай выводы сейчас. Я свои сделал:
Мой контейнер может всё и сразу, что могут все три, с которыми ты сравнивал, по отдельности. Причем синтаксис прозрачнее и проще чем у любого из них. Так что, как говорится, не можешь срать, не мучай жёпу.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.