ArdentParameterBundle/Service/ParameterService.php

113 lines
3.6 KiB
PHP
Raw Normal View History

2019-05-23 17:04:48 +02:00
<?php
2020-07-25 17:40:08 +02:00
namespace Ardent\ParameterBundle\Service;
2019-05-23 17:04:48 +02:00
2020-07-27 01:02:18 +02:00
use Ardent\ParameterBundle\DependencyInjection\Configuration;
2020-07-25 16:07:01 +02:00
use Ardent\ParameterBundle\Entity\Parameter;
2019-05-23 17:04:48 +02:00
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
2022-01-30 01:11:39 +01:00
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
2020-07-27 01:02:18 +02:00
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
2019-05-23 17:04:48 +02:00
class ParameterService
{
private array $config;
2019-05-23 17:04:48 +02:00
public function __construct(
private EntityManagerInterface $em,
private ParameterBagInterface $parameter,
array $config
)
2019-05-23 17:04:48 +02:00
{
2020-07-27 01:02:18 +02:00
$this->config = $this->supplementConfig($config);
2019-05-23 17:04:48 +02:00
}
public function get(string $name, bool $parse = true): mixed
2019-05-23 17:04:48 +02:00
{
$split = explode('_', $name);
$category = array_shift($split);
2019-05-23 17:04:48 +02:00
$paramRepo = $this->em->getRepository(Parameter::class);
/** @var Parameter $parameter */
2019-05-23 17:04:48 +02:00
$parameter = $paramRepo->findOneBy(['name' => $name]);
if ($parameter) {
if ($parse) {
// find and replace all %parameter% with their value
$value = preg_replace_callback('/%([^%\s]+)%/', function ($match) {
$key = $match[1];
// first try locally
if ($value = $this->get($key)) {
return $value;
}
// then try with parameter bag
return $this->parameter->get($key);
},
$parameter->getValue()
);
} else {
$value = $parameter->getValue();
}
return Parameter::parseValue($value, $this->config[$category][$name]['type']);
2019-05-23 17:04:48 +02:00
} else {
return null;
}
}
/**
2020-07-27 01:23:13 +02:00
* @param string $name The name of the parameter in the format <group>_<parameter>
2019-05-23 17:04:48 +02:00
*/
public function set(string $name, mixed $value): void
2019-05-23 17:04:48 +02:00
{
$paramRepo = $this->em->getRepository(Parameter::class);
/* @var Parameter $parameter */
$parameter = $paramRepo->findOneBy(['name' => $name]);
if (!$parameter) {
$parameter = (new Parameter())->setName($name);
}
$parameter->setValue($value);
$this->em->persist($parameter);
$this->em->flush();
}
private function supplementConfig(array $rawConfig): array
2020-07-27 01:02:18 +02:00
{
$config = [];
foreach ($rawConfig as $groupName => $rawGroup) {
$group = [];
foreach ($rawGroup as &$value) {
2020-07-27 01:02:18 +02:00
switch ($value['type']) {
default:
case Configuration::TYPE_TEXT:
$class = TextType::class;
break;
case Configuration::TYPE_NUMBER:
$class = NumberType::class;
break;
2022-01-30 01:11:39 +01:00
case Configuration::TYPE_BOOL:
$class = CheckboxType::class;
break;
2020-07-27 01:02:18 +02:00
}
2020-07-27 01:23:13 +02:00
// Add the group name in front of the parameter name
2020-07-27 01:02:18 +02:00
$value['name'] = sprintf('%s_%s', $groupName, $value['name']);
$value['type'] = $class;
$group[$value['name']] = $value;
2020-07-27 01:02:18 +02:00
unset($value);
}
$config[$groupName] = $group;
2020-07-27 01:02:18 +02:00
}
return $config;
}
/**
* @return array
*/
public function getConfig()
{
return $this->config;
}
2019-05-23 17:04:48 +02:00
}