2013-03-21 9 views
6

Ich arbeite an einem Symfony 2-Projekt, bei dem jeder Benutzer seine eigene Datenbank hat. In meiner config.yml-Datei habe ich eine Doktrin: dbal: orm für einen Client gesetzt, aber keine Verbindungseigenschaften, weil sie zur Laufzeit gesetzt und von allen Benutzern referenziert werden. Dh ich habe nur eine Standard-DBAL-Verbindung und zwei ORM-Verbindungen und die Anzahl der Benutzer ist unbegrenzt.Symfony 2 Konsolenbefehl zum Erstellen einer benutzerdefinierten Datenbank

Das funktioniert gut, aber ich muss die Datenbank und das Schema erstellen, wenn der Benutzer registriert ist (FOS UserBundle). Im erweiterten Userbundle-Controller kann ich meine eigene Logik setzen. Das Problem ist, dass ich die "php app/console doctrine: database: create" nicht ausführen kann, da für den neuen Benutzer keine Parameter festgelegt sind.

Gibt es eine Möglichkeit, einen benutzerdefinierten Datenbankparameter für die Konsolenbefehle anzugeben? Ich könnte das wahrscheinlich durch einige sehr hässliche mysql-Befehle umgehen, aber das möchte ich lieber nicht. Vielen Dank im Voraus!

+1

Sie nur Verbindung passieren können, aber keine Parameter. Besser du erstellst deinen eigenen Befehl! – Venu

Antwort

1

Sie können Ihren eigenen Befehl mit dem Code unten als Umriss erstellen:

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; 
    } 
} 
Verwandte Themen