2015-12-10 120 views
1

在Symfony2項目中使用了2個數據庫。我需要即時更改第二個數據庫的詳細信息。Symfony2 - 在控制器中使用`setParameter`

有什麼辦法可以在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.

有沒有從那裏我可以改變這些其他任何方式參數?

+0

正如錯誤所述,更改conf爲時已晚。我的問題是:你是否在運行時發現數據庫設置?或者db已經被定義了?在第二種情況下,您可以從容器中獲得服務,並使用setter方法使用關於哪個db需要使用的服務。我的兩美分 – Matteo

+0

@Matteo:我需要在運行時使用數據庫設置。我無法將其添加到parameter.yml中。在一個使用entitymanager的地方,我創建了新的數據庫連接,並且通過該數據庫連接即時創建了一個新的entitymanager。但我不知道如何爲呼叫服務做到這一點。 – AnkiiG

+0

你已經看到這個http://stackoverflow.com/questions/20805637/symfony2-dynamic-doctrine-database-connections-at-runtime? – Matteo

回答

0

如果您在運行時發現數據庫座標,我建議立即創建一個EntityManager並通過setter方法將其傳遞給服務。你的服務可以暴露$ em class字段中的setter以接受外部的EntityManager做這些事情。

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

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

然後將它傳遞給服務爲:

所以在您的控制器中this答案描述你可以實例化新的EntityManager

$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

感謝您的回答... – AnkiiG

相關問題