Как загрузить параметры конфигурации Symfony из базы данных (Doctrine)
Вместо жесткого кодирования параметров в parameters.yml
я пытаюсь загрузить их из базы данных. Не все параметры в параметрах .yml необходимо загрузить из базы данных всего несколько, например, api details of paypal
В config.yml
я импортировал parameters.php
imports:
- { resource: parameters.php }
Если добавить статическую информацию в parameters.php
, как показано ниже, она отлично работает
$demoName = 'First Last';
$container->setParameter('demoName', $demoName);
Однако я не могу получить информацию из таблицы базы данных. Я думал, что должен создать класс и использовать $em = this->getDoctrine()->getManager();
, и он должен работать, но это не так, и я получаю ошибку
Notice: Undefined variable: paypal_data in /opt/lampp/htdocs/services/app/config/parameters.php (which is being imported from "/opt/lampp/htdocs/services/app/config/config.yml").
Это попытка, которую я сделал, следующая, но код, похоже, не входит в __construct()
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Doctrine\ORM\Mapping as ORM;
class parameters extends Controller
{
public $paypal_data;
function __construct() {
$this->indexAction();
}
public function indexAction(){
$em = $this->getDoctrine()->getManager();
$this->paypal_data = $em->getRepository('featureBundle:paymentGateways')->findAll();
}
}
$demoName = 'First Last';
$container->setParameter('demoName', $demoName);
$container->setParameter('paypal_data', $this->paypal_data);
Любая помощь будет очень оценена.
Ответы
Ответ 1
Вы делаете неправильные вещи. Вам нужно объявить свой CompilerPass и добавить его в контейнер. После того, как будет загружен весь контейнер... во время компиляции у вас будет доступ ко всем сервисам в нем.
Просто получите службу менеджера объектов и запросите необходимые параметры и зарегистрируйте их в контейнере.
Пошаговая инструкция:
-
Определить пропуск компилятора:
# src/Acme/YourBundle/DependencyInjection/Compiler/ParametersCompilerPass.php
class ParametersCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$em = $container->get('doctrine.orm.default_entity_manager');
$paypal_params = $em->getRepository('featureBundle:paymentGateways')->findAll();
$container->setParameter('paypal_data', $paypal_params);
}
}
-
В классе определения пучка вам нужно добавить пропуск компилятора в контейнер
# src/Acme/YourBundle/AcmeYourBundle.php
class AcmeYourBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ParametersCompilerPass(), PassConfig::TYPE_AFTER_REMOVING);
}
}