2013-03-21 20 views
6

Pracuję nad projektem Symfony 2, w którym każdy użytkownik ma własną bazę danych. W moim pliku config.yml mam doktrynę: dbal: zestaw orm dla klienta, ale bez właściwości połączenia, ponieważ są one ustawione w środowisku wykonawczym i odwołują się do wszystkich użytkowników. Mam tylko jedno domyślne połączenie dbal i dwa połączenia orm, a liczba użytkowników jest nieograniczona.Polecenie konsoli Symfony 2 służące do tworzenia niestandardowej bazy danych

Działa to dobrze, ale muszę utworzyć bazę danych i schemat, gdy użytkownik jest zarejestrowany (FOS UserBundle). W rozszerzonym kontrolerze userbundle mogę ustawić własną logikę. Problem polega na tym, że nie mogę uruchomić "php app/console doctrine: database: create", ponieważ nie ma parametrów ustawionych dla nowego użytkownika.

Czy istnieje sposób określenia niestandardowego parametru bazy danych dla poleceń konsoli? Prawdopodobnie mógłbym obejść to przez jakieś bardzo brzydkie polecenia mysql, ale wolałbym nie. Wielkie dzięki z góry!

+1

Można jedynie przekazać połączenie, ale nie parametry. Lepiej stwórz własne polecenie! – Venu

Odpowiedz

1

Można tworzyć własne komendy przy użyciu kodu poniżej jako kontur:

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; 
    } 
} 
Powiązane problemy