20

我们开始在工作中的项目中采用 Symfony 2,这很棒,但是我正在努力解决一个我几乎已经遇到的挑战,但还不是完全。

Symfony 将环境的概念视为单个服务器上的单独运行时。这很棒,因为您可以使用不同的前端控制器 (web) 在运行时之间切换,或者随心所欲地使用 env 开关 (cli)。

但是,作为开发过程的一部分,我们的代码部署在许多服务器上。每个人都有一个本地虚拟机,然后代码通过集成、QA、暂存,最后是生产传播。

因此,我们的环境概念是服务器(虚拟或物理)。以下是此自定义配置的目标

  1. 在运行时环境切换方面维护 Symfony 的 ootb 功能
  2. 允许每个服务器的公共(即开发人员控制)配置
  3. 维护每个服务器的私有(即 sysad 控制的)配置
  4. 适用于 web 和 cli

这意味着我们不能仅仅 100% 依赖parameters.ini或任何静态命名的文件,因为开发人员需要控制每个服务器的配置,而且所有这些文件都将在 git 中彼此相邻。

所以,我想做就是这个。向设置服务器环境的 parameters.ini 添加一个新值。像这样的东西

应用程序/配置/参数.ini

[parameters]
    server="int"

然后,在内核中,根据该值加载一个附加配置文件。例如,我希望它可以工作,但它没有(因为在此步骤中容器还不存在)

应用程序/AppKernel.php

public function registerContainerConfiguration(LoaderInterface $loader)
{
  $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');

  // Per-server config
  $server = $this->getContainer()->getParameter( 'server' );        
  if ( $server )
  {
    $loader->load(__DIR__.'/config/server/'.$server.'.yml');
  }
}

这将使开发人员可以使用app/config/server/int.yml之类的文件来控制非私有(即,不是 parameters.ini)配置值。

感谢您的阅读,如果有什么令人困惑的地方,请告诉我。

编辑

为了澄清,我不能使用或依赖的东西

  • *nix 环境变量来自用户的配置文件或通过export. 为什么?集成、QA 和暂存可能都在同一个盒子上
  • vhost 配置中的任何内容(不适用于 cli)
  • 静态命名的文件(即,刚刚命名为server.ini的文件不起作用)
4

1 回答 1

29

好的,我终于想出了该怎么做。真的只需要对 AppKernel 进行基本修改

应用程序/AppKernel.php

public function registerContainerConfiguration(LoaderInterface $loader)
{

  // Symfony environment config
  $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');

  // Load server config, if it exists
  $parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true );
  if ( $parameters && isset( $parameters['parameters']['server.env'] ) )
  {
    $serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml';
    if ( file_exists( $serverConfig ) )
    {
      $loader->load( $serverConfig );
    } else {
      error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig );
    }
  }
}

应用程序/配置/参数.ini

[parameters]
    # ...
    server.env="int"
    server.title="Integration"
    server.name="Int 1"

现在我可以根据需要在app/config/server/中创建%server.env%.yml文件。

感谢那些阅读本文的人 - 我最初在想一些更复杂的东西,这使得这个简单的解决方案在一段时间内不可见;)

于 2012-04-04T18:54:11.723 回答