123 lines
3.4 KiB
PHP
123 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Ardent\ParameterBundle\Service;
|
|
|
|
use Ardent\ParameterBundle\DependencyInjection\Configuration;
|
|
use Ardent\ParameterBundle\Entity\Parameter;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
|
use Symfony\Component\Form\Extension\Core\Type\NumberType;
|
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
|
|
|
class ParameterService
|
|
{
|
|
/** @var EntityManagerInterface */
|
|
private $em;
|
|
|
|
/** @var ParameterBagInterface */
|
|
private $parameter;
|
|
private $config;
|
|
|
|
/**
|
|
* ParameterService constructor.
|
|
*
|
|
* @param EntityManagerInterface $em
|
|
* @param ParameterBagInterface $parameter
|
|
* @param $config
|
|
*/
|
|
public function __construct(EntityManagerInterface $em, ParameterBagInterface $parameter, $config)
|
|
{
|
|
$this->em = $em;
|
|
$this->parameter = $parameter;
|
|
$this->config = $this->supplementConfig($config);
|
|
}
|
|
|
|
/**
|
|
* @param string $name
|
|
* @param bool $parse
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get($name, $parse = true)
|
|
{
|
|
$paramRepo = $this->em->getRepository(Parameter::class);
|
|
$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 $value;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $name
|
|
* @param $value
|
|
*/
|
|
public function set($name, $value)
|
|
{
|
|
$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();
|
|
}
|
|
|
|
/**
|
|
* Replaces the types in the config by their classes
|
|
*
|
|
* @param $config
|
|
* @return array
|
|
*/
|
|
private function supplementConfig($config)
|
|
{
|
|
foreach ($config as $groupName => &$group) {
|
|
foreach ($group as &$value) {
|
|
switch ($value['type']) {
|
|
default:
|
|
case Configuration::TYPE_TEXT:
|
|
$class = TextType::class;
|
|
break;
|
|
case Configuration::TYPE_NUMBER:
|
|
$class = NumberType::class;
|
|
break;
|
|
}
|
|
|
|
$value['name'] = sprintf('%s_%s', $groupName, $value['name']);
|
|
$value['type'] = $class;
|
|
unset($value);
|
|
}
|
|
unset($group);
|
|
}
|
|
return $config;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getConfig()
|
|
{
|
|
return $this->config;
|
|
}
|
|
}
|