2013-03-21 29 views
6

Tôi đang làm việc trên một dự án Symfony 2 nơi mỗi người dùng có cơ sở dữ liệu riêng của mình. Trong tệp config.yml của tôi, tôi có một doctrine: dbal: orm được đặt cho một máy khách nhưng không có thuộc tính kết nối vì chúng được đặt ở thời gian chạy và được tham chiếu bởi tất cả người dùng. I. Tôi chỉ có một kết nối dbal mặc định và hai kết nối orm và số lượng người dùng không giới hạn.Lệnh Symfony 2 Console để tạo cơ sở dữ liệu tùy chỉnh

Điều này hoạt động tốt nhưng tôi cần phải tạo cơ sở dữ liệu và lược đồ khi người dùng được đăng ký (FOS UserBundle). Trong bộ điều khiển người dùng mở rộng, tôi có thể đặt logic của riêng mình. Vấn đề là tôi không thể chạy 'php app/console doctrine: database: create' vì không có tham số nào được thiết lập cho người dùng mới.

Có cách nào chỉ định tham số cơ sở dữ liệu tùy chỉnh cho lệnh giao diện điều khiển không? Tôi có thể có được xung quanh điều này bởi một số lệnh mysql rất xấu xí nhưng tôi không muốn. Rất cám ơn trước!

+1

Bạn chỉ có thể vượt qua kết nối nhưng không tham số. Tốt hơn bạn nên tạo ra lệnh của riêng bạn! – Venu

Trả lời

1

Bạn có thể tạo lệnh của riêng bạn bằng cách sử dụng mã dưới đây là một phác thảo:

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; 
    } 
} 
Các vấn đề liên quan