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

Ahoj,
chci udělat CompilerExtension rozšíření, které:

  1. 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;
  2. 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:

  1. Jak v metodě loadConfiguration() či beforeCompile() získat
    1. službu nette.database.default,
    2. nebo aspoň její přihlašovací údaje k DB?
  2. Jak v metodě loadConfiguration() či beforeCompile() 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
+
+2
-
  1. 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 ;-)
  2. $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.