В проекте 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.
Есть ли другой способ, откуда я могу изменить эти параметры?
если вы обнаружите координаты 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;
}
Надеюсь, что эта помощь