Změna hodnoty v souboru typu neon
- kolibla
- Člen | 25
Ahoj,
měl byste někdo ukázku, jak změnit key → value hodnotu?
Například pokud máme v configu:
parameters:
whatever: value1
Tak bych potřebovala tento config změnit na:
parameters:
whatever: value2
Předpokládám, že to bude prachsprostý zápis do souboru s tím, že se pak musí smazat i cache typu Nette.Configurator.
Editoval kolibla (10. 12. 2020 16:39)
- Petr Parolek
- Člen | 455
např. takto:
<?php
$configNeon = __DIR__ . "/../../../config/config.local.neon";
$configNeonContent = \Nette\Neon\Neon::decode(file_get_contents($configNeon));
$configNeonContent['parameters']['foo'] = $values['foo'];
$output = \Nette\Neon\Neon::encode($configNeonContent, \Nette\Neon\Neon::BLOCK);
if (is_writable($configNeon)) {
file_put_contents($configNeon, $output);
} else {
$this->presenter->flashMessage("Soubor $configNeon není zapisovatelný nebo neexistuje", "warning");
}
...
?>
- David Matějka
- Moderator | 6445
Ahoj, o moc lepší ukázka zápisu do neon souboru existovat nebude. Ale lepší cesta je se tomu zcela vyhnout. Co a proč tam konkrétně potřebuješ zapisovat?
- kolibla
- Člen | 25
David Matějka napsal(a):
Ahoj, o moc lepší ukázka zápisu do neon souboru existovat nebude. Ale lepší cesta je se tomu zcela vyhnout. Co a proč tam konkrétně potřebuješ zapisovat?
Ahoj :)
services.neon:
App\Model\Services\ServiceWhatever(%service.login%, %service.pass%, %service.url%, %service.running%)
Tohle je můj ukázkový use-case. Takže potřebuji proměnnou
%service.running%
měnit. V té třídě se pak služba dle
$this->running
rozhoduje. Samozřejmě, že by to šlo otočit
vůči databázi, ale již je logika přes soubor.
- kolibla
- Člen | 25
ppar napsal(a):
např. takto:
<?php $configNeon = __DIR__ . "/../../../config/config.local.neon"; $configNeonContent = \Nette\Neon\Neon::decode(file_get_contents($configNeon)); $configNeonContent['parameters']['foo'] = $values['foo']; $output = \Nette\Neon\Neon::encode($configNeonContent, \Nette\Neon\Neon::BLOCK); if (is_writable($configNeon)) { file_put_contents($configNeon, $output); } else { $this->presenter->flashMessage("Soubor $configNeon není zapisovatelný nebo neexistuje", "warning"); } ... ?>
Ahoj, zdravím tě :)
Přijde mi to jako taková neuchopitelná špagetka. Promiň za ten výraz, inspirovat se dle toho určitě budu, s tím, že tam ještě postrádám to odstranění cache? Na to by se musel taky udělat nějaký těžko uchopitelný koncept? :)
- Pavel Kravčík
- Člen | 1196
Ono to o moc lépe nepůjde bych řekl, my za běhu programu měníme náš definiční soubor na „blbosti jako posílání mailů na testovací/produkční adresu“ následně, místo writable bych použil nette safe, jinak to moc lépe asi nejde zapsat.
$file = join(DIRECTORY_SEPARATOR, [$this->tempDir, '..', 'app', 'config', 'global.neon']);
$array = Neon::decode(file_get_contents($file));
//změna souboru
file_put_contents('nette.safe://' . $file, Neon::encode($array, Neon::BLOCK));
//invalidace cache
unlink, shel_exec apod.
opcache_reset();
- Marek Bartoš
- Nette Blogger | 1280
Měnit konfigurační soubory v produkci není moc dobrý nápad
Jestli nechceš používat databázi a ten přepínač máš v souboru, tak
můžeš použít dynamické parametry nebo importované služby. Můžeš
konfiguraci měnit v bootstrapu při každém requestu a není třeba měnit
konfigurační soubor ani mazat cache.
https://doc.nette.org/…on/bootstrap#…
- David Matějka
- Moderator | 6445
Ukládat to do databáze je jediná rozumná cesta, při zápisu do souboru ta aplikace není cloud friendly – není provozovatelná ve více instancích, jelikož k zápisu dojde jen na jedné instanci, která se zrovna hitne.