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

Любая помощь будет высоко ценится.

Solutions Collecting From Web of "Как загрузить параметры конфигурации Symfony из базы данных (Doctrine)"

Вы делаете неправильные вещи. Вам нужно объявить свой 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); } }