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