2013-03-21 17 views
6

Her kullanıcının kendi veritabanına sahip olduğu Symfony 2 projesinde çalışıyorum. Benim config.yml dosyasında bir doktrinim var: dbal: orm bir istemci için ayarlandı ancak bağlantı özellikleri yok çünkü bunlar çalışma zamanında ayarlandı ve tüm kullanıcılar tarafından başvuruda bulundu. I. Ben sadece bir varsayılan dbal bağlantım ve iki orm bağlantısı var ve kullanıcı sayısı sınırsız.Symfony 2 Özel Veritabanı oluşturmak için Konsol komutu

Bu iyi çalışıyor ancak kullanıcı kaydedildiğinde veritabanı ve şema oluşturmam gerekiyor (FOS UserBundle). Genişletilmiş userbundle kontrolörde kendi mantığımı koyabilirim. Sorun şu ki, yeni kullanıcı için ayarlanmış parametreler olmadığından 'php app/console doktrini: database: create' komutunu çalıştıramam.

Konsol komutlarına özel bir veritabanı parametresi belirtmenin herhangi bir yolu var mı? Muhtemelen bazı çok çirkin mysql komutları ile bunu aşabilirim ama tercih etmem. Çok teşekkürler şimdiden!

+1

Yalnızca bağlantıyı ancak parametreleri geçirebilirsiniz. Kendi komutunu yaratsan iyi olur! – Venu

cevap

1

Sen bir taslak olarak aşağıdaki kodu kullanarak kendi komut oluşturabilirsiniz:

namespace Doctrine\Bundle\DoctrineBundle\Command; 

use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Doctrine\DBAL\DriverManager; 

class CreateDatabaseDoctrineCommandDynamically extends DoctrineCommand 
{ 

    protected function configure() 
    { 
     $this 
      ->setName('doctrine:database:createdynamic') 
      ->setDescription('Creates the configured databases'); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
    /*** 
     ** Edit this part below to get the database configuration however you want 
     **/ 
     $connectionFactory = $this->container->get('doctrine.dbal.connection_factory'); 
     $connection = $connectionFactory->createConnection(array(
     'driver' => 'pdo_mysql', 
     'user' => 'root', 
     'password' => '', 
     'host' => 'localhost', 
     'dbname' => 'foo_database', 
     )); 

     $params = $connection->getParams(); 
     $name = isset($params['path']) ? $params['path'] : $params['dbname']; 

     unset($params['dbname']); 

     $tmpConnection = DriverManager::getConnection($params); 

     // Only quote if we don't have a path 
     if (!isset($params['path'])) { 
      $name = $tmpConnection->getDatabasePlatform()->quoteSingleIdentifier($name); 
     } 

     $error = false; 
     try { 
      $tmpConnection->getSchemaManager()->createDatabase($name); 
      $output->writeln(sprintf('<info>Created database for connection named <comment>%s</comment></info>', $name)); 
     } catch (\Exception $e) { 
      $output->writeln(sprintf('<error>Could not create database for connection named <comment>%s</comment></error>', $name)); 
      $output->writeln(sprintf('<error>%s</error>', $e->getMessage())); 
      $error = true; 
     } 

     $tmpConnection->close(); 

     return $error ? 1 : 0; 
    } 
}