2016-03-30 1 views
1

Je souhaite stocker des connexions de base de données dans une base de données statique. Sur demande, je veux créer une nouvelle base de données, stocker les informations d'identification dans ma base de données statique, puis créer le schéma dans la nouvelle base de données à partir d'entités existantes. Je sais comment faire cela en utilisant l'outil de ligne de commande de symfony. Mon but est de le faire fonctionner dans un service. Je regardais dans les documents de doctrine et d'essayer de faire fonctionner quelque chose:Création dynamique de bases de données et de schémas dans Symfony/Doctrine

$conn =$this->getDoctrine()->getConnection()->getSchemaManager()->createDatabase($dbname); 
    $isDevMode = true; 
    $config = Setup::createAnnotationMetadataConfiguration(array('UiCoreDbBundle/Entity'), $isDevMode); 

    $conn = array(
     'driver' => 'pdo_mysql', 
     'host' => '127.0.0.1', 
     'user' => 'root', 
     'dbname' => $dbname 
    ); 
    $em = EntityManager::create($conn,$config); 

    $tool = new SchemaTool($em); 
    $classes = array(
     $em->getClassMetadata('Product') 
     //... 
    ); 

    $tool->createSchema($classes); 

Mon code exemple ne fonctionne pas comme je l'espérais. La doctrine ne peut pas trouver mes entités. Quelqu'un peut-il me donner un indice sur la bonne façon de mettre en œuvre une telle tâche?

Répondre

1

je suis venu avec une solution et que vous souhaitez laisser l'extrait de code pour les générations futures:

/** 
* @param string $dbname 
* @throws \Doctrine\ORM\ORMException 
* @throws \Doctrine\ORM\Tools\ToolsException 
*/ 
public function createDatabase($dbname) 
{ 
    $this->em->getConnection()->getSchemaManager()->createDatabase($dbname); 
    $params = $this->em->getConnection()->getParams(); 
    $conn = array(
     'driver' => $params['driver'], 
     'host' => $params['host'], 
     'user' => $params['user'], 
     'dbname' => $dbname 
    ); 
    $newEm = EntityManager::create($conn,$this->em->getConfiguration(), $this->em->getEventManager()); 
    $meta = $this->em->getMetadataFactory()->getAllMetadata(); 

    $tool = new SchemaTool($newEm); 
    $tool->createSchema($meta); 
} 

En fait, je suis débrouillent mon manager de l'entité par défaut existante, qui connaît mes entités et faire quelques changements de paramètres. Au lieu de getAllMetadata vous pouvez ajouter les classes manuellement à l'aide:

$meta = array(
     $newEm->getClassMetadata('Bundlename:Entityclass') 
     //... 
    ); 

S'il vous plaît laissez-moi savoir, si quelqu'un connaît une meilleure façon. Cheers