PHP 5.3 a parsování INI souborů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

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

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

To samozřejmě možné je, ale ztratí se tím (jediná?) výhoda integrovaného parseru – obrovská rychlost.

David Grudl
Nette Core | 8218
+
0
-

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.

veena
Člen | 98
+
0
-

David Grudl napsal(a):

[common]
set.iconv-internal_encoding = "utf-8"
service.Nette-Security-IAuthenticator = Users

třeba takhle?

[common]
set iconv.internal_encoding = "utf-8"
service Nette.Security.IAuthenticator = Users
David Grudl
Nette Core | 8218
+
0
-

Mezera bohužel taky nejde, skutečně jen [_a-z0-9][_a-z0-9.-]

phx
Člen | 651
+
0
-

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

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"