Nette 3: problém s presentery v kontejneru

- Eda
- Backer | 220
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… :-)