php – 与数据库连接的parameters.yml和config_(dev | stage | prod).yml混淆

我理解为什么我应该在parameters.yml文件中保留我的数据库连接,但我还想为dev,stage和prod环境设置其他数据库连接以及不同的主机.我以为我可以将config_dev.yml,config_test.yml和config_prod.yml与config.yml结合使用,我错了吗?

在parameters.yml我持有主数据库连接,但我可以将其移动到配置吗?

示例:config.yml

# Doctrine Configuration - notice there is no host defined here
doctrine:
    dbal:
      default_connection: blah
      connections:
        blah:
          driver:   pdo_pgsql
          port:     5432
          dbname:   blah
          user:     blah_user
          password: blah_pass
          charset:  UTF8
        foo:
          driver:   pdo_pgsql
          port:     5432
          dbname:   foo
          user:     foo_user
          password: foo_pass
          charset:  UTF8

示例:config_dev.yml

# Doctrine Configuration - Here I define the dev hosts
doctrine:
    dbal:
      connections:
        blah:
          host: blah_dev
        foo: 
          host: foo_dev

示例:config_test.yml

# Doctrine Configuration - Here I define the stage or QA hosts
doctrine:
    dbal:
      connections:
        blah:
          host: blah_stage
        foo: 
          host: foo_stage

示例:config_prod.yml

# Doctrine Configuration - Here I define the prod hosts
doctrine:
    dbal:
      connections:
        blah:
          host: blah_prod
        foo: 
          host: foo_prod

现在我也删除了parameters.yml中的设置,但Symfony / Doctrine不喜欢这个.我错过了什么吗?我怎样才能设置像我这样的东西?

现在,如果我在parameters.yml中定义默认数据库连接,我可以连接到它然后

parameters:
    database_driver: pdo_pgsql
    database_host: blah_prod
    database_port: 5432
    database_name: blah
    database_user: blah_user
    database_password: blah_pass

在config.yml中

doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"

但是现在我放弃了我需要的多个数据库以及从dev切换到stage到prod数据库服务器的能力.

我必须遗漏一些额外的文档来解决这个问题,任何帮助都会很棒.

我已经看过使用Doctrine进行多数据库连接的文档

> http://symfony.com/doc/current/cookbook/doctrine/multiple_entity_managers.html

但是我想避免在parameters.yml中为每个dev,stage和prod服务器添加如下所示的三个数据库选项.

parameters:
    database_driver: pdo_pgsql
    database_host: blah_dev
    database_port: 5432
    database_name: blah
    database_user: blah_user
    database_password: blah_pass
    #database_driver2: pdo_pgsql
    database_host2: blah_stage
    #database_port2: 5432
    #database_name2: blah
    #database_user2: blah_user
    #database_password2: blah_pass
    #database_driver3: pdo_pgsql
    database_host3: blah_prod
    #database_port3: 5432
    #database_name3: blah
    #database_user3: blah_user
    #database_password3: blah_pass

(也许只是配置不同的主机?)

这看起来很丑陋和PITA,这只是对于blah数据库,我必须为foo和我需要配置的任何其他数据库执行此操作.

最佳答案
如果每个环境中的连接相同但只有配置值不同,则应使用parameters-configuration-file.在parameters.yml.dist文件中定义您需要的环境变量,如下所示:

# parameters.yml.dist
parameters:
    database_host_1: blah
    database_host_2: blub
    ...

您的config.ml可能如下所示:

# config.yml
imports:
    - { resource: parameters.yml }
...
doctrine:
    dbal:
  default_connection: blah
  connections:
    blah:
      driver:   pdo_pgsql
      port:     5432
      host:     "%database_host_1%"
      dbname:   blah
      user:     blah_user
      password: blah_pass
      charset:  UTF8
    foo:
      driver:   pdo_pgsql
      port:     5432
      host:     "%database_host_2%"
      dbname:   foo
      user:     foo_user
      password: foo_pass
      charset:  UTF8

如果缺少parameters.yml,则下次调用composer update时将要求输入数据库主机名.

如果要将所有配置保存在单独的文件中,则应在config_XXX.yml文件的开头添加:

# config_XXX.yml
imports:
    - { resource: config.yml }
    - { resource: parameters_XXX.yml }

将XXX替换为您的环境.为每个环境创建一个parameters_XXX.yml,并在其中设置主机的配置参数,就像在默认的parameters.yml文件中一样.

# parameters_XXX.yml
parameters:
    database_host_1: blahInXXXEnv
    database_host_2: blubInXXXEnv
    ...

转载注明原文:php – 与数据库连接的parameters.yml和config_(dev | stage | prod).yml混淆 - 代码日志