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… :-)