mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-27 07:00:29 +01:00
177 lines
5.0 KiB
PHP
177 lines
5.0 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace Xentral\Modules\SystemConfig\Gateway;
|
||
|
|
||
|
use Exception;
|
||
|
use TypeError;
|
||
|
use Xentral\Components\Database\Database;
|
||
|
use Xentral\Modules\SystemConfig\Exception\ConfigurationKeyNotFoundException;
|
||
|
use Xentral\Modules\SystemConfig\Exception\InvalidArgumentException;
|
||
|
use Xentral\Modules\SystemConfig\Exception\SystemConfigClassCreationFailed;
|
||
|
use Xentral\Modules\SystemConfig\Exception\SystemConfigClassTypeError;
|
||
|
use Xentral\Modules\SystemConfig\Helper\SystemConfigHelper;
|
||
|
use Xentral\Modules\SystemConfig\Interfaces\SystemConfigSerializableInterface;
|
||
|
|
||
|
final class SystemConfigGateway
|
||
|
{
|
||
|
/** @var Database $db */
|
||
|
private $db;
|
||
|
|
||
|
/** @var SystemConfigHelper $helper */
|
||
|
private $helper;
|
||
|
|
||
|
/**
|
||
|
* @param Database $database
|
||
|
* @param SystemConfigHelper $helper
|
||
|
*/
|
||
|
public function __construct(
|
||
|
Database $database,
|
||
|
SystemConfigHelper $helper
|
||
|
) {
|
||
|
$this->db = $database;
|
||
|
$this->helper = $helper;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $namespace
|
||
|
* @param string $key
|
||
|
* @param mixed $default
|
||
|
*
|
||
|
* @throws InvalidArgumentException
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function tryGetValue(string $namespace, string $key, string $default = null): ?string
|
||
|
{
|
||
|
$configurationKey = $this->helper->getValidatedConfigurationKey($namespace, $key);
|
||
|
|
||
|
$result = $this->fetchValueFromDatabase($configurationKey);
|
||
|
|
||
|
if ($result === false) {
|
||
|
if(is_null($default)){
|
||
|
return null;
|
||
|
}
|
||
|
return (string)$default;
|
||
|
}
|
||
|
|
||
|
return (string)$result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $configurationKey
|
||
|
*
|
||
|
* @return false|string
|
||
|
*/
|
||
|
protected function fetchValueFromDatabase($configurationKey)
|
||
|
{
|
||
|
$sql = 'SELECT `wert`
|
||
|
FROM `konfiguration`
|
||
|
WHERE `name` = :name LIMIT 1';
|
||
|
$values = [
|
||
|
'name' => $configurationKey,
|
||
|
];
|
||
|
|
||
|
return $this->db->fetchValue($sql, $values);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $namespace
|
||
|
* @param string $key
|
||
|
*
|
||
|
* @throws InvalidArgumentException
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function isKeyExisting(string $namespace, string $key): bool
|
||
|
{
|
||
|
$configurationKey = $this->helper->getValidatedConfigurationKey($namespace, $key);
|
||
|
|
||
|
$sql = 'SELECT `name`
|
||
|
FROM `konfiguration`
|
||
|
WHERE `name` = :name';
|
||
|
$values = [
|
||
|
'name' => $configurationKey,
|
||
|
];
|
||
|
|
||
|
return !empty($this->db->fetchValue($sql, $values));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $class
|
||
|
*
|
||
|
* @throws InvalidArgumentException
|
||
|
* @throws ConfigurationKeyNotFoundException
|
||
|
*
|
||
|
* @return object|SystemConfigSerializableInterface
|
||
|
*/
|
||
|
public function getObject(string $class)
|
||
|
{
|
||
|
if (!in_array(SystemConfigSerializableInterface::class, class_implements($class), true)) {
|
||
|
$message = sprintf('Class %s does not implement %s', $class, SystemConfigSerializableInterface::class);
|
||
|
throw new InvalidArgumentException($message);
|
||
|
}
|
||
|
|
||
|
/** @var SystemConfigSerializableInterface $class */
|
||
|
$namespace = $class::getSystemConfigNamespace();
|
||
|
$key = $class::getSystemConfigKey();
|
||
|
|
||
|
$result = $this->getValue($namespace, $key);
|
||
|
|
||
|
try {
|
||
|
return $class::fromArray(unserialize($result, ['allowed_classes' => false]));
|
||
|
} catch (Exception $exception) {
|
||
|
$message = 'Was not able to create object for class ' . $class;
|
||
|
throw new SystemConfigClassCreationFailed($message, $exception->getCode(), $exception);
|
||
|
} catch (TypeError $error) {
|
||
|
throw new SystemConfigClassTypeError($error->getMessage(), $error->getCode(), $error);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $namespace
|
||
|
* @param string $key
|
||
|
*
|
||
|
* @throws InvalidArgumentException
|
||
|
* @throws ConfigurationKeyNotFoundException
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getValue(string $namespace, string $key): string
|
||
|
{
|
||
|
$configurationKey = $this->helper->getValidatedConfigurationKey($namespace, $key);
|
||
|
|
||
|
$result = $this->fetchValueFromDatabase($configurationKey);
|
||
|
|
||
|
if ($result === false) {
|
||
|
$message = sprintf(
|
||
|
'Key "%s" was not found in namespace "%s".',
|
||
|
$key,
|
||
|
$namespace
|
||
|
);
|
||
|
throw new ConfigurationKeyNotFoundException($message);
|
||
|
}
|
||
|
|
||
|
return (string)$result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @deprecated Used to get legacy configuration data from the database <br>
|
||
|
* Ideally this function should only be used to migrate data in combination with the deleteLegacyKey() function
|
||
|
*
|
||
|
* @param string $key
|
||
|
*
|
||
|
* @return string|null
|
||
|
*/
|
||
|
public function tryGetLegacyValue(string $key): ?string
|
||
|
{
|
||
|
$result = $this->fetchValueFromDatabase($key);
|
||
|
if($result === false){
|
||
|
return null;
|
||
|
}
|
||
|
return (string)$this->fetchValueFromDatabase($key);
|
||
|
}
|
||
|
|
||
|
}
|