CompilerExtension a otazky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
hrach
Člen | 1836
+
0
-

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
+
0
-

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

hrach
Člen | 1836
+
0
-

Diky moc! Asi se zkusim vydat tou cestou co pouzivas v Kdyby/Aop: findByTypes(). Nestalo by za to udelat pullrequest na ten resolve po loadConfiguration? Prijde mi to celkem jako dulezitra funkcionalita pro compiler extension, az se divim, ze to je v tomto stavu. :)

Filip Procházka
Moderator | 4668
+
0
-

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ě.

hrach
Člen | 1836
+
0
-

Hele, tak pokud sem pridas radek:

$this->container->prepareClassList();

Tak to zacne cely fungovat tak, jak chceme. Zadny testy nefailuji, funguje to jak potrebujeme, ale nevim presne, jak to moc jinak testovat :)