Symfony2 - 在Controller中使用`setParameter`

时间:2015-12-10 06:53:41

标签: php symfony doctrine-orm

Symfony2项目中使用了2个数据库。我需要动态更改第二个数据库详细信息。

有没有办法在Symfony2的控制器中的函数中使用容器setParameter()

下面是一段代码,我需要动态更改数据库名称:

$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.

我可以通过其他方式更改这些参数吗?

1 个答案:

答案 0 :(得分:0)

如果你在运行时发现数据库坐标我建议动态创建一个EntityManager并通过setter方法将其传递给服务。您的服务可以在$ em类字段上公开一个setter,以接受外部EntityManager来执行这些操作。

因此,在您的控制器中,您可以按照this回答中所述实例化新的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;
}

希望这个帮助