Как загрузить параметры конфигурации 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);
        }
    }