Získání služby z DI ve statické metodě

CuchulainMacLugh
Člen | 18
+
0
-

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
+
+3
-

Ř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 | 8107
+
+2
-

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
+
0
-

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)