Symfony2 - использовать `setParameter` в контроллере

1

В проекте Symfony2 используются 2 базы данных. Мне нужно изменить данные второй базы данных на лету.

Есть ли способ использовать контейнер setParameter() в функции в контроллере Symfony2?

Ниже приведен фрагмент кода, где мне нужно изменить имя базы данных "на лету":

$container = $this->container;
$container->setParameter('second_database_host','localhost');
$container->setParameter('second_database_name','test');
$container->setParameter('second_database_user','root');
$container->setParameter('second_database_password','root');
$parameter_bag = $container->getParameterBag();
$service_manager = $container->get('projects_objects.manager');
$object_import = $service_manager->import($service_type));

Но выше код дает ошибку, поскольку Impossible to call set() on a frozen ParameterBag.

Есть ли другой способ, откуда я могу изменить эти параметры?

  • 0
    Как говорит ошибка, уже слишком поздно менять конф. Мой вопрос: вы обнаруживаете настройки БД во время выполнения? Или дб уже определено? Во втором случае вы можете получить сервис из контейнера и установить инструмент, о котором БД необходимо использовать с помощью метода установки. Мои два цента
  • 0
    @Matteo мне нужно использовать настройки базы данных во время выполнения. Я не могу добавить его в parameter.yml. В одном месте, где использовался EntityManager, я создал новое соединение с базой данных, и с этим подключением к базе данных на лету создал новый EntityManager. Но я не знаю, как я могу сделать это для вызова службы.
Показать ещё 4 комментария
Теги:
doctrine2

1 ответ

0
Лучший ответ

если вы обнаружите координаты db во время выполнения, я предлагаю создать EntityManager "на лету" и передать его службе через метод setter. Ваш сервис может выставить сеттер в поле класса $ em для принятия внешнего EntityManager для выполнения этого действия.

Таким образом, в вашем контроллере вы можете создать экземпляр нового EntityManager, как описано в этом ответе:

$conn = array(
    'driver'   => 'pdo_mysql',
    'user'     => 'root',
    'password' => '',
    'dbname'   => 'foo'
);

$new = \Doctrine\ORM\EntityManager::create(
    $conn,
    $em->getConfiguration(),
    $em->getEventManager()
);

Затем передайте его службе:

$service_manager = $container->get('projects_objects.manager');
$service_manager->setEntityManager($new); // <-- the entity manager istantiate on the fly
$object_import = $service_manager->import($service_type));  

Служба выглядит так:

....
// the entity manager
protected $em;

public function setEntityManager($em)
{
    $this->em=$em;
}

Надеюсь, что эта помощь

  • 0
    спасибо за этот ответ ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню