CompilerExtension a otazky
- hrach
- Člen | 1836
Ahoj, mam par otazek na compilerextension.
Muj idealni usecase:
- zjistim, jestli uzivatel definoval nejakou sluzbu, tedy idealne jestli definoval tridu implementujici inteface
- pokud ne, nadefinuju vlastni sluzbu.
Akorat mi prijde, ze jediny co je mozny, tak ze zjistim, jestli mne uzivatel v „extension config sekci“ vyplnil nejaky klic, tak dle toho tu sluzbu jeho muzu pridat, ale prijde mi to zbytecny, kdyz uz to muze byt v sekci services.
- Filip Procházka
- Moderator | 4668
Hola,
diky autowiringu se resolvuji třídy až mezi beforeCompile
a
afterCompile
, tedy v žádném momentu v podstatě nemáš šanci
si vytáhnout služby podle typů. Osobně tohle považuji za největší
slabinu a myslím si, že ten resolve by se měl volat ještě jednou, mezi
loadConfiguration
a beforeCompile
.
Tvoje jediná možnost je projít všechny služby, kouknout jestli mají classu, když ano, tak analyzovat, když mají factory, tak doufat že zase obsahuje typ, protože ten opět snadno zanalyzuješ. Pak ještě můžou obsahovat volání metody nad jinou službou, nebo statickou factory, nebo nějaký další magicky kombinace který jsou strašně super že je možné je zapsat, ale tady v tomhle bodě je to na mašli, protože ti nezbývá než duplikovat logiku z compileru v Nette.
Osobně tohle řeším tak, že službu odmítám analyzovat pokud obsahuje moc složitou konstrukci a házím výjimku, nebo používám tagy.
Docela brutálně ohackované to mám v Kdyby/Aop nebo v Kdyby/Events. Tady se jednoduše spoléhám na to, že když mi neřekneš typ služby, tak ti to prostě nebudu analyzovat. Fakt není od věci nutit lidi používat tagy :)
- Filip Procházka
- Moderator | 4668
On asi nikdo nepíše tak složitý rozšíření jako já, takže jsem jedinej komu to chybí :) Ale ano, určitě bych se nezlobil kdyby to dělalo Nette za mě.