Nette 3: problém s presentery v kontejneru

Eda
Backer | 220
+
0
-

Zdarec.

Konečně jsem se odhodlal upgradnout z Nette 2.4 na Nette 3. Většina věcí v pohodě, i ty, co jsem čekal, že budou bolet (typefixer supr, většina avizovaných BC breaků bez problémů…), trošku bolely některé doplňky, které přestaly existovat nebo nepodporují Nette 3, ale za to Nette nemůže, žejo :-) Ale narazil jsem naopak na něco, co bych předtím vůbec nečekal, že bude problém, a navíc to ani nebyl avizovaný BC break. A prostě nevím, jak to hezky vyřešit… :-(

Jde o to, že využívám toho, že presentery jsou zaregistrované jako služby. Některé presentery mi nesou informaci o tom, jaká vyhledávací kritéria využívají (výpis seznamu vozů, výpis výluk atd.), a občas potřebuju si z DI vytáhnout informaci o tom, jaká kritéria ten který presenter používá. No a to teď najednou v Nette 3 přestalo fungovat, byť v 2.4 to fungovalo. ApplicationExtension totiž přidává všechny nalezené presentery s vypnutým autowiringem. Jak to tedy řešit?

To přece musí jít konfigurovat, ne? Nejde, v ApplicationExtension je tohle hardcodované

Další, co mne napadlo, bylo přepsat si ApplicationExtension, podědit si to z Nette a tuto jednu metodku přepsat a tento jeden řádek tam upravit. Ale to taky nejde, protože ApplicationExtension je final :-( A celý to duplikovat teda nechci.

Třetí, co mne napadlo, bylo, pomocí DecoratorExtension zapnout autowiring pro potomky Nette\Application\UI\Presenter, ale to nejde, protože property autowired není v DecoratorExtension podporována. Přitom tohle by teda bylo luxusní a hezký řešení.

decorator:
	Nette\Application\UI\Presenter:
		autowired: true

Čtvrtá věc, co mne napadla, je, že si teda ty presentery zaregistruju do DI sám a nastavím jim tam autowired: true ručně. To se ale taky neprojeví. Furt v megapoli $wiring vidím, že autowirované nejsou. Nj, ono to totiž ApplicationExtension prostě přebije a nastaví to tam všude napevno na autowired: false.

Tzn asi jediný, co mi zbývá, je, nedávat do config.neon žádný presenter, vypnout scanDirs a scanComposer pro application a přidat si ty presentery do kontejneru sám rozšířením, které bude volané až po ApplicationExtension, aby mi tam ty autowired příznaky nikdo nezrušil. Takto to teď mám, ale nepřijde mi to teda ideální.

Němá někdo ještě nějaký jiný nápad, jak to hezky udělat?

Btw: docela časově náročný tohle řešit, ale zase ostatní věci šly rychleji, než jsem čekal, tak ve výsledku žádná katastrofa… :-)

David Grudl
Nette Core | 8082
+
0
-

Jak sis ty presentery z kontejneru vytahoval?

Eda
Backer | 220
+
0
-

Pomocí getByType() na Containeru.

David Grudl
Nette Core | 8082
+
+1
-

A nemůžeš použít findByType?

Eda
Backer | 220
+
+1
-

Můžu, boží, díky, vyřešeno! :-)

Tohle je přesně ta nějaká drobnost, která mi chyběla do celé skládačky.