Jak přidat službu do configu před jeho sestavením?
- joseff
- Člen | 233
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
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ě. :-)
- Panda
- Člen | 569
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
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['...']){
...
}