PHP 5.3 a parsování INI souborů
- David Grudl
- Nette Core | 8218
PHP 5.3 přichází se striktnějším parserem INI souboru. Zatímco
předchozí parser dovoloval v klíčích a názvech sekcí používat téměř
jakékoliv znaky, nový parser omezil klíče na
[_a-z0-9][_a-z0-9.-]
. Vše nasvědčuje tomu, že změna je
definitivní, proto je na čase upravit třídu ConfigAdapterIni.
Třída umožňuje nastavit jiný oddělovač statickou vlastností
ConfigAdapterIni::$keySeparator
. Výchozí hodnota
'> '
je v PHP 5.3 nepoužitelná. Jednou z možností by bylo
přejít na '.'
a upravit INI soubory:
[production < common]
database> driver = sqlite
database> file = "%modelsDir%/demo.db"
database> lazy = TRUE
na
[production < common]
database.driver = sqlite
database.file = "%modelsDir%/demo.db"
database.lazy = TRUE
Tečka je určitým standardem, nicméně celé to má ještě háčky (a proto se vlastně v Nette nepoužívala). Třída Environment (resp. Configurator) totiž rozumí i takovýmto zápisům:
[common]
set> iconv.internal_encoding = "utf-8"
service> Nette\Security\IAuthenticator = Users
Záměna oddělovače na tečku by kolidovala s prvním řádkem, další dva řádky budou neprůchozí i nadále. Řešením by mohlo být v direktivách místo kolidujících znaků použít zbývající povolený znak a to pomlčku:
[common]
set.iconv-internal_encoding = "utf-8"
service.Nette-Security-IAuthenticator = Users
Záměnu zpět z pomlčky na jiný znak by pak provedl kód, který konfiguraci vykonává (a tedy by znal kontext a věděl, čím pomlčku nahradit).
Další možností je implementovat oddělovač klíčů i pro názvy podsekcí:
[common.set]
iconv.internal_encoding = "utf-8"
Nicméně z uvedených problémů to řeší jen první, a to ještě ne úplně čistě.
Co myslíte?
- honzajavorek
- Člen | 57
Ještě je možnost napsat si vlastní INI parser a na ten v PHP se vybodnout… Ale předpokládám, že to je cesta, kterou nechceš jít :) .
- David Grudl
- Nette Core | 8218
To samozřejmě možné je, ale ztratí se tím (jediná?) výhoda integrovaného parseru – obrovská rychlost.
- David Grudl
- Nette Core | 8218
Uvedené řešení je pro testovací účely implementoval do revize 61. Upravte si tedy INI soubory a stáhněte poslední verzi dibi, kdyby něco nefungovalo, dejte vědět.
- phx
- Člen | 651
David Grudl napsal(a):
Uvedené řešení je pro testovací účely implementoval do revize 61. Upravte si tedy INI soubory a stáhněte poslední verzi dibi, kdyby něco nefungovalo, dejte vědět.
Jak tedy upravit ini soubor?
Dibi??? Nemyslel jsi Nette?
Pokud me pamet neklame tak ini se parsuje jen jednou a pote se nacita z cache ne? Takze by to nemuselo byt s tou rychlosti tak hrozny.
- David Grudl
- Nette Core | 8218
Zdá se, že ve verzi PHP 5.3 RC1 je uvnitř klíče povolen nově i znak
*
. Také je možné zapisovat:
set[date.timezone] = "Europe/Prague"
set[iconv.internal_encoding] = "%encoding%"
set[mbstring.internal_encoding] = "%encoding%"
set[include_path] = "%appDir%;%libsDir%"
ve starších verzích PHP lze jen
item[] = "One"
item[] = "Two"
item[] = "Three"