Jak přidat službu do configu před jeho sestavením?

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

Zdravím, potřeboval bych přidat službu addService(..) do hlavniho container, ale dostal jsem se do smičky. Tu službu kterou jsem si vytvořil je poměrně složité nastavit a bohužel ji není možné nastavit v configu, proto jsem se rozhodl ji vytvořit manuálně v bootstrapu a pak ji přidat do configu. Jenže kdy ji tam mohu přidat? Odkazuji se na ni totiž v configu, takže musí být k dispozici při vytváření systemContaineru (jinak se vyhodi chyba: Reference to missing service..), jenže to ji zase nemohu přidat, protože systemContainer ještě neexistuje…

Má někdo nápad jak to vytvořit?

Editoval joseff (1. 2. 2012 14:02)

Panda
Člen | 569
+
0
-

Pokud potřeba to mít složité a zároveň robustní, udělal bych si na ní CompilerExtension. V metodě loadConfig můžeš přidávat definice služeb ještě před tím, než se začne kontejner sestavovat. Registrace pak proběhne v události Configurator::onCompile, která jako druhý parametr přejímá objekt typu Compiler s metodou addExtension.

Pokud to tak složité a robustní není, tak bych prostě konfiguraci nechal na továrně. :-)

joseff
Člen | 233
+
0
-

Díky moc, to vypadá OK.

joseff
Člen | 233
+
0
-

Ještě by mě zajímalo, zda lze v configu nějak přistupovat k robotloaderu, potřeboval bych ho předat jako službu a @robotLoader nějak nejede… Dik

Panda
Člen | 569
+
0
-

Jako služba tam RobotLoader není, ale $configurator->createRobotLoader() vrací jeho instanci, takže si jí můžeš uložit někam bokem (a třeba přihodit do kontejneru přes instanci vytvořené extension).

Na co potřebuješ RobotLoader? Nešlo by to bez něj? Taková vazba se mi nezdá moc čistá.

Editoval Panda (2. 2. 2012 0:00)

joseff
Člen | 233
+
0
-

Máš pravdu, nedošlo mi že ho nepotřebuju. šlo o to že jedna služba se rozhoduje na základě toho zda je jiná třída definovaná, což lze ovšem jednoduše zjistit fci class_exist… což mi nedošlo. Dík za nakopnutí :-)

joseff
Člen | 233
+
0
-

Jedna věc mi stále není jasná, proč nelze vkládat data na kterých jsou zavilé services do SystemContaineru až po jeho vytvoření. Na to samé jsem se vlastně ptal už na začátku. Děkuji za vysvětlení, ale nebylo by lepší v configu odkazovat na neexistující službu, parametr apod, kterou bych po vytvoření vložil (jako addService nebo parameters[…]). Právě jsem narazil na problém s jazykem, ten se totiž detekuje až v Presenteru, což už je dávno po vytvoření SystemContaineru, jenže já potřebuji jazyk předávat jako parametr do konstruktoru v mnoha třídách, což je problém. Koukal jsem do SystemContaineru a problém je ten, že se parametry do konstruktoru přeadávají „natvrdo hodnotou“ takže je jasné že je nemůžu změnit později, což mi vadí. Lze to nějak obejít a předávat je jako proměnou:

__construct($this->parameters['...']){
...
}