在Controller Symfony2上创建数据库选择和模式

时间:2014-01-14 10:47:32

标签: symfony dependency-injection doctrine-orm controller doctrine

我正在尝试创建一个新数据库并从Controller加载架构。

我动态创建了数据库,但不知道如何选择新数据库来加载架构。

这是我的代码:

parameters.yml

parameters:

    # Admin database
    database_driver: pdo_mysql
    database_host: localhost
    database_port: '3306'
    database_name: app_db
    database_user: root
    database_password: XXX

    # A Center database
    database_driver2: pdo_mysql
    database_host2: localhost
    database_port2: '3306'
    database_name2: center_1
    database_user2: root
    database_password2: XXX

config.yml

# Doctrine Configuration
doctrine:
    dbal:
        default_connection:   default
        connections:

            default:
                driver:   %database_driver%
                host:     %database_host%
                port:     %database_port%
                dbname:   %database_name%
                user:     %database_user%
                password: %database_password%
                charset:  UTF8

            center:
                driver:   %database_driver2%
                host:     %database_host2%
                port:     %database_port2%
                dbname:   %database_name2%
                user:     %database_user2%
                password: %database_password2%
                charset:  UTF8

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        #auto_mapping: true

        default_entity_manager: default
        entity_managers:

            default:
                connection: default
                mappings:
                    BackendBundle: ~
                    CenterBundle: ~
            center:
                connection: center
                mappings:
                    UsuarioBundle: ~

在我添加新中心的控制器中,我即时创建数据库,center_1,center_2 ......

###################
# CREATE DATABASE #
###################

$connectionFactory = $this->container->get('doctrine.dbal.connection_factory');

$connection = $connectionFactory->createConnection(array(
    'driver' => 'pdo_mysql',
    'user' => 'root',
    'password' => XXX,
    'host' => 'localhost',
    'dbname' => 'center_'.$center->getId(),
));

$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);
    echo sprintf('<info>Created database for connection named <comment>%s</comment></info>', $name);
} catch (\Exception $e) {
    echo sprintf('<error>Could not create database for connection named <comment>%s</comment></error>', $name);
    echo sprintf('<error>%s</error>', $e->getMessage());
    $error = true;
}

$tmpConnection->close();

我的问题是,如何选择该数据库并加载架构。

可以动态更新Center数据库的parameters.yml,然后执行de命令:

app/console doctrine:schema:create --em=center

如果不可能,又怎么做呢?

** * ** * ** * 编辑14/01/13

我添加了一个我喜欢的例子,也许我没有解释清楚。

当我添加一个新的中心时,上面的代码会为这个中心创建一个新的中心和一个新的数据库,例如数据库调用“center_13”

现在,如果我喜欢创建数据库模式,我需要转到parameters.yml并为该数据库创建一个新参数

parameters.yml

parameters:

    ....

    # A Center database
    database_name_13: center_13

我还需要在config.yml中创建一个新连接

config.yml

# Doctrine Configuration
doctrine:
    dbal:
        default_connection:   default
        connections:

            default:
                ...

            center_13:
                driver:   %database_driver%
                host:     %database_host%
                port:     %database_port%
                dbname:   %database_name_13%
                user:     %database_user%
                password: %database_password%
                charset:  UTF8

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        #auto_mapping: true

        default_entity_manager: default
        entity_managers:

            default:

                ...

            center_13:
                connection: center_13
                mappings:
                    UsuarioBundle: ~

现在如果我运行命令

app/console doctrine:schema:create --em=center_13

它使用UsuarioBundle实体配置数据库“center_13”。

我想知道如何在我的控制器的de create center动作中执行此过程

1 个答案:

答案 0 :(得分:1)

命令

  

app / Console doctrine:schema:create

  

app / console doctrine:schema:update

将按照模型配置中的定义配置数据库,但不能从控制器配置。

你可以create a custom symfony command并将它与你的 createDatabaseController 相关联,但我会确保它首先值得付出努力。