Zkuste omezit metadata, která se generují společně s DI kontejnerem

David Grudl
Nette Core | 8227
+
+14
-

Do masteru nette/di jsem přidal možnost omezit metadata, která se generují jako součást DI kontejneru. Dají se zmenšit až na zlomek původní velikosti. Jak na to?

Jednoduše v konfiguraci řekněte, které z nich potřebujete jen během kompilace, ale už ne při běhu aplikace.

di:
	export:
		parameters: no

Přistane vkládat do konstruktoru DI kontejneru parametry. Protože přistupovat k těmto parametrům není obecně dobrý nápad, není to čistý postup, tak by mělo být obecně v pohodě je vypnout.

di:
	export:
		tags: no

Vypne export všech tagů, se kterými se pracuje metodou $container->findByTag(). Vypnout export všech se nemusí úplně hodit, tak můžeme místo toho vyjmenovat, které z nich přenášet:

di:
	export:
		tags:
			- cached
			- listener

Bude exportovat jen tagy cached a listener.

Každý CompilerExtension is může vynutit exportování nějakého tagu tím, že zavolá $this->compiler->addExportedTag('jmenotagu').

A nakonec metadata, která tvoří asi největší objem dat. Informace pro autowiring a vyhledávání podle tříd:

di:
	export:
		types:
			- Nette\Database\Container

Uveďte zde třídy, se kterými voláte $container->getByType() (třída Nette\Application\Application je v seznamu automaticky). Informace o ostatních třídách se přestanou přenášet.

Opět platí, že pokud nějaká extension sama v runtime nějaký typ potřebuje (např. v metodě initialize() volá getByType()), může export vynutit přes $this->compiler->addExportedType(...).

David Grudl
Nette Core | 8227
+
+1
-

To platí v případě, že se presentery vytvářejí za běhu a ne při kompilaci. Lepší je nastavit application > scanDirs tak, aby je našlo a automaticky přidávalo do kontejneru.

Martk
Člen | 661
+
0
-

@DavidGrudl díky za velmi rychlou odpověď, dokonce jsem stihl odstranit i komentář :(

scanDirs mám vypnutý, protože mám autoloading od composeru. Aby mi to našlo presentery, tak musím zavolat dumpautoload s přepínačem -o . Pak vše frčí, tak jak má a bez chyb.

David Grudl
Nette Core | 8227
+
0
-

Super :)

Btw jaký je důvod místo automatiky, co hledá presentery na pozadí, používat něco, u čeho je potřeba manuálně aktualizovat data?

Martk
Člen | 661
+
0
-

Moje neznalost composeru. Když jsem viděl, že je tam scanComposer (teď si myslím, že je pro mě úplně zbytečný a budu ho vypínat) a používat autoloading jen od composeru, tak jsem si říkal na co potřebuji scanDirs a robotLoader. Udělal jsem to před 2–3 lety a do teď jsem na to nesáhl.

Co se stane, když budu mít presenter v nějakém balíčku? Taky by se to nemělo automaticky načíst, když nebudu mít zapnutý přepínač -o (nebo nastavený v composer.json).

Takže postačí zaregistrovat v extension presentery jako služby a nette si je najde (přes findByType)?