Diskuze: Nefungující uložení hodnot do JSON
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Ahoj,
nahraď funkci fread() za file_get_contents() a smaž řádek 4 a 7 a mělo by
to fungovat
unset ($GLOBALS["_config"]);
$GLOBALS["_config"] = json_decode (file_get_contents($this->path), true);
Co se týče řešení obecně, tak
Já osobně bych to řešil asi nějak takto:
namespace MatejStrnad\Settings;
use Exception;
class SettingsManager
{
/**
* @var array Stores current settings.
*/
private $data;
/**
* @var string Path to settings file.
*/
private $filePath;
/**
* SettingsManager constructor.
* @param string $filePath Path to settings file.
*/
public function __construct($filePath)
{
$this->filePath = $filePath;
$this->load();
}
/**
* Loads settings from file.
*/
public function load()
{
if (file_exists($this->filePath)) {
$this->data = json_decode(file_get_contents($this->filePath), true);
} else {
$file = fopen($this->filePath, 'w');
fclose($file);
}
}
/**
* Gets setting value.
* @param string $key Settings key to return.
* @return string|null
*/
public function getValue($key)
{
if (isset($this->data[$key])) {
return $this->data[$key];
} else {
return null;
}
}
/**
* Saves value to settings file.
* @param string $key Settings key to set.
* @param string $value Value of the key.
* @throws Exception
*/
public function setValue($key, $value)
{
$fileContents = json_decode(file_get_contents($this->filePath), true);
$fileContents[$key] = $value;
$file = fopen($this->filePath, 'w');
if (fwrite($file, json_encode($fileContents)) === false) {
throw new Exception("Write error!");
}
fclose($file);
}
}
Pokud to ale budeš používat pouze pro ukládání údajů od databáze, tak mi to přijde zbytečně složité. V tomto případě bych asi použil jen obyčejnou statickou třídu:
class Settings
{
public static $database = array(
'host' => "192.168.1.123",
'user' => "root",
'pass' => "12345",
'db' => "system"
);
public static $projectName = "Jméno projektu";
}
A použiješ ji jednoduše takto:
echo(Settings::$projectName); //Vypíše název projektu
$ip = Settings::$database['host']; //Uloží adresu do proměnné
Nevýhoda tohoto řešení je, že nejde jednoduše nastavení měnit z aplikace, to ale u údajů od databáze většinou nepotřebujeme. Velkou výhodou je ale zase to, že kdyby se někomu podařilo nějak tento soubor načíst (např. chybou v jiné třídě), tak jeho obsah stejně uživatel neuvidí, protože se soubor jen načte v php a uživateli se jeho obsah neodešle...
Pozn. Ještě mě napadlo, metoda setValue by se dala pěkně zjednodušit pomocí metody file_put_contents, ale funkce je stejná:
public function setValue($key, $value)
{
$fileContents = json_decode(file_get_contents($this->filePath), true);
$fileContents[$key] = $value;
if (file_put_contents($this->filePath, $fileContents) === false) {
throw new Exception("Write error!");
}
}
Mám otázku napríklad na túto metódu:
public function getValue ($key) {
if (isset($this->data[$key])) {
return $this->data[$key];
} else {
return null;
}
}
Nešla by zapísať aj takto?
public function getValue ($key) {
return $this->data[$key] ?? null;
}
Ano, určitě šla. Jen pozor na to, že tento tzv. "null coalescing operator" je podporován až od verze PHP 7 a mnoho (špatných) hostingů používá stále ještě PHP 5.x. Ale pokud máš kvalitní hosting, kde si můžeš vybrat a nebo mají PHP aktualizované, tak určitě. Na starším PHP by to šlo zapsat také třeba ternálním operátorem:
return isset($this->data[$key]) ? $this->data[$key] : null
Zobrazeno 5 zpráv z 5.