<?php
namespace App\Service;
use App\Repository\ParametroRepository;
class Parametros
{
private ParametroRepository $repository;
private array $cache = [];
private bool $cacheLoaded = false;
public function __construct(ParametroRepository $parametroRepository)
{
$this->repository = $parametroRepository;
}
/**
* Verifica se o parâmetro está definido na aplicação
* @param string $name
* @return bool
*/
public function has($name): bool {
$name = strtolower($name);
if (!array_key_exists($name, $this->cache)) {
$this->load($name);
}
return $this->cache[$name]['id'] != 0;
}
/**
* Retorna o valor de um parâmetro definido
* @param string $name
* @return mixed
*/
public function get(string $name) {
return $this->doGet($name, 'value', null, false);
}
/**
* Retorna o valor de um parâmetro possivelmente não definido
* @param string $name
* @param mixed $default
* @return mixed
*/
public function getIfDefined(string $name, $default=null) {
return $this->doGet($name, 'value', $default, true);
}
/**
* Retorna o valor para Humanos de um parâmetro definido
* @param string $name
* @return mixed
*/
public function getHuman(string $name) {
return $this->doGet($name, 'human', null, false);
}
/**
* Retorna uma informação sobre o parâmetro, ou morre
* @param string $name
* @param string $field
* @param mixed $default
* @param bool $silent
* @return mixed
*/
private function doGet(string $name, string $field, $default, bool $silent) {
$name = strtolower($name);
if (!array_key_exists($name, $this->cache)) {
$this->load($name);
}
if ($this->cache[$name]['id'] != 0) {
return $this->cache[$name][$field];
}
else {
if ($silent) {
return $default;
}
throw new \LogicException("Parâmetro não inicializado: '$name' -- Execute a sincronização.");
}
}
/**
* Carrega o parâmetro do banco de dados para o cache, se existir
* @param string $name
*/
private function load(string $name) {
if (!$this->cacheLoaded) {
$params = $this->repository->findAll();
$this->cache = [];
foreach ($params as $param) {
$this->cache[$param->getName()] = [
'id' => $param->getId(),
'value' => $param->getValue(),
'datatype' => $param->getDataType(),
'human' => $param->getHumanValue(),
];
}
}
if (!array_key_exists($name, $this->cache)) {
$this->cache[$name] = ['id' => 0];
}
}
}