Změna hodnoty v souboru typu neon

kolibla
Člen | 25
+
0
-

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

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");
}
...
?>
kolibla
Člen | 25
+
-1
-

Má někdo prosím lepší ukázku?

David Matějka
Moderator | 6445
+
+2
-

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?

Petr Parolek
Člen | 455
+
0
-

kolibla napsal(a):

Má někdo prosím lepší ukázku?

Popiš v čem lepší ukázku.

kolibla
Člen | 25
+
0
-

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

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

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

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

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.