Načtení více konfiguračních souborů
- Karel Klíma
- Člen | 31
Při práci s Nette se každý může dostat do situace, kdy mu jeden
konfigurační soubor config.ini
nebude stačit. Ať už chcete
mít pro každý použitý modul/plugin/komponentu vlastní oddělené
nastavení nebo chcete konfigurační soubor generovat automaticky (například
uložení konfigurace DB při instalaci aplikace), následující vychytávka se
vám bude hodit. Třída MultipleConfigurator
rozšiřuje
vestavěný Nette Configurator
a přidává podporu pro
načítání více konfiguračních souborů do jedné „proměnné“.
Metoda MultipleConfigurator::loadConfig()
se liší od té
původní pouze v jedné věci – nezavolá funkci
Config::freeze()
, a tak můžeme objekt dále upravovat a
rozšiřovat. Samotné načítání konfigurace do existujícího objektu
obsluhuje metoda MultipleConfigurator::merge()
.
Pro zakomponování do aplikace stačí přidat do bootstrap.php
následující kód:
Použití pak vypadá následovně:
Výsledkem bude konfigurační proměnná, která bude obsahovat direktivy z obou souborů. Pokud dojde ke konfliktu názvů, použije se vždy poslední hodnota konfigurační direktivy.
Co na to říkáte? Uvítám jakékoliv poznámky a nápady.
- Karel Klíma
- Člen | 31
Jan Tvrdík napsal(a):
Čím se to liší od zápisu
bez použití
MultipleConfiguratoru
?
Pokud se dvakrát za sebou zavolá Environment::loadConfig()
za
použítí standardního Configuratoru
, pak
Environment::getConfig()
vrátí pouze konfigurační direktivy
z druhého souboru.
- Cifro
- Člen | 245
Karel Klíma napsal(a):
Pokud se dvakrát za sebou zavoláEnvironment::loadConfig()
za použítí standardníhoConfiguratoru
, pakEnvironment::getConfig()
vrátí pouze konfigurační direktivy z druhého souboru.
Joo a presne toto teraz potrebujem :)
Edit: Ale nefunguje dobre, resp. „dedičnosť“ nefunguje dobre. Ak
nastavim v config.ini
php.date.timezone = "Europe/Bratislava"
, a v
modules.ini
nie je nastavené tak to vráti potom „php“ ⇒
null. Čo by správne mala byť predchadzajúca hodnota.
Editoval Cifro (15. 1. 2010 21:41)
- norbe
- Backer | 405
Nešla by podpora nahrávání více konfiguračních souborů přidat přímo do nette? Chtěl jsem využít této třídy, ale pak mi došlo, že se připravím o výhodu nastavit robotloader až v konfigu, případně musím dát natvrdo require.
Přidáním parametru $append do Environment::loadConfig by se vyřešila případná zpětná nekompatibilita
- Karel Klíma
- Člen | 31
fenix napsal(a):
Moje reseni:
Tohohle lze využít, pokud se načítají všechny konfigurační soubory najednou. Já jsem ovšem řešil následující situaci: vyvíjel jsem aplikaci složenou z několika samostatných a nezávislých modulů; nejdříve jsem načetl všeobecný konfigurační soubor, který obsahoval i požadované názvy modulů – ty se pak v inicializační fázi mohli nebo nemuseli přidat další konfigurační soubor. Hlavní požadavek tedy byl, aby bylo možné načítat soubory dynamicky. Samozřejmě by to šlo mergeovat i později, ale už by to nebylo tak pohodlné.
- srigi
- Nette Blogger | 558
Chalani neslo by tie vase volne zasuvatelne moduly (o to sa tu predsa snazite) vyriesit pomocou bootstrapovania modulov? Tak ako to ma ZendFramework – je hlavny bootstrap – bootstrapuje alikaciu a nasledne, v nom (alebo v logike frameworku) sa dohladaju v aplikacii moduly a tie su nasledne bootstrapovane svojimi bootstrap subormi. Tie uz si obstaraju konfig modulu same.
Umoznuje to naozaj volne zasuvanie modulov – stiahnes z netu archiv, ten staci rozbalit do zlozky pre moduly a app si ho automaticky natiahne. Ked sa modul natiahne, sam, pomocou svojho bootsreappera sa runtime nakonfiguruje
Editoval srigi (20. 2. 2010 20:02)
- Karel Klíma
- Člen | 31
srigi napsal(a):
Chalani neslo by tie vase volne zasuvatelne moduly (o to sa tu predsa snazite) vyriesit pomocou bootstrapovania modulov? Tak ako to ma ZendFramework – je hlavny bootstrap – bootstrapuje alikaciu a nasledne, v nom (alebo v logike frameworku) sa dohladaju v aplikacii moduly a tie su nasledne bootstrapovane svojimi bootstrap subormi. Tie uz si obstaraju konfig modulu same.
Umoznuje to naozaj volne zasuvanie modulov – stiahnes z netu archiv, ten staci rozbalit do zlozky pre moduly a app si ho automaticky natiahne. Ked sa modul natiahne, sam, pomocou svojho bootsreappera sa runtime nakonfiguruje
Přesně takhle funguje i ta mnou vyvíjená aplikace. Problém je ten, že Config je v podstatě singleton – v Nette je to dělané tak, že se to jednou načte ze souboru a pak se z toho hodnoty akorát získávají. Tento krok tedy lze udělat jen jednou, zatím co mám-li víc modulů, potřebuji konfigurační soubory načítat víckrát. Samozřejmě by se to dalo řešit tak, že by měl každý modul svůj unikátní Config, to má jistě své výhody (obzvlášť z bezpečnostního hlediska), ale někdy se to prostě nemusí hodit.
- Karel Klíma
- Člen | 31
honzakuchar napsal(a):
Ahoj, nechceš to přidat do extras?
Má to cenu? Přeci jenom, jedná se pouze o zakomentování jednoho řádku…