Získání služby z DI ve statické metodě
- CuchulainMacLugh
- Člen | 18
Dá se ve statické metodě třídy z DI vytáhnout nějaká služba?
Konkrétně máme v projektu jednu třídu se statickými metodami a potřebuju
do ní dostat Cache.
Ano, ta metoda musí být statická. Je na ní hromada vazeb v celém projektu a výhledově to budeme celé od základu přepisovat, tak to teď nechci měnit.
- Milo
- Nette Core | 1283
Řešil jsem to několikrát při refactoringu legacy aplikací a nejvíc se mi osvěčilo injektovat služby do statické třídy v indexu:
class VaseStatickaTrida
{
private static Cache $cache;
public static function getInjectMethod(): \Closure
{
return function (CacheStorage $storage) {
self::$cache = new Cache($storage);
};
}
}
a v index.php před startem aplikace:
$dic = App\Bootstrap::boot()->createContainer();
$dic->callMethod(VaseStatickaTrida::getInjectMethod());
$dic->getByType(Nette\Application\Application::class)->run();
Trochu svádí si tam injectnout celý container, ale není to dobré. Začne se to motat při refactoringu.
- David Grudl
- Nette Core | 8227
Z DI se nedá vytáhnout služba ani v nestatické metodě :-)
Služby se zkrátka z DI netahají. Naopak DI je předává do objektů, které vytváří.
Po staré projekty si můžeš DI kontejner někde staticky vystavit (zapsat do nějaké statické proměnné) a pak k němu přistupovat.
- CuchulainMacLugh
- Člen | 18
Díky @Milo , šlape jak potřebuju :-)
Jasně @DavidGrudl , díky za upřesnění. Blbě jsem to formuloval.
Editoval CuchulainMacLugh (13. 1. 2022 6:49)