CompilerExtension problém Slepice&Vejce
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- nanuqcz
- Člen | 822
Ahoj,
chci udělat CompilerExtension rozšíření, které:
- se připojí k DB, vytáhne z tama nějaká data, a na základě nich přidá do DI/Containeru nějaké služby;
- koukne, jestli je určitá služba již registrována, pokud ne, registruje vlastní.
Chápu, že pokud ještě Container není vytvořený, nemůžu z něho tahat služby (např. připojení k DB). A že pokud už vytvořený a nakešovaný je (takže služby tahat můžu), zase do něj nemůžu nic přidat.
Něco mi ale říká, že řešení existuje (i když možná ne 100% čisté), jen na něho nemůžu přijít. Poradíte, jak na to? :-)
Díky.
P.S. Hlavní problémy teda podle mě jsou:
- Jak v metodě
loadConfiguration()
čibeforeCompile()
získat- službu
nette.database.default
, - nebo aspoň její přihlašovací údaje k DB?
- službu
- Jak v metodě
loadConfiguration()
čibeforeCompile()
zkontrolovat, jestli již daná služba (na základě názvu služby, nebo implementované třídy, je mi to jedno) existuje?
- Zax
- Člen | 370
- Minimálně parametry by měly jít normálně předat konstruktorem přímo do extension, Nette si takhle běžně předává temp dir. Aspoň ty přihlašovací údaje si předáš a connection vyrobíš ručně když už nic jinýho ;-)
- $builder->findByType() – v loadConfiguration vrací služby, které sis zrovna zaregistroval v aktuálním rozšíření, v beforeCompile vrací všechny služby.
Snad jsem nic nepopletl.