Symfony 2 - 多服务器配置

Pet*_*ley 20 php configuration symfony

我们开始采用Symfony 2来处理工作中的项目,这很棒,但是我正在努力解决这个问题,我几乎已经完成了,但并不完全.

Symfony将环境的概念视为单个服务器上的单独运行时.这很棒,因为您可以在不同的前端控制器(Web)或使用env开关(cli)的情况下切换运行时间.

但是,我们的代码作为开发过程的一部分部署在许多服务器上.每个人都有一个本地VM,然后代码通过Integration,QA,Staging和最后的Production传播.

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

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

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

那么,是什么我喜欢做的就是这个.向parameters.ini添加一个新值,用于设置服务器环境.像这样的东西

应用程序/配置/ parameters.ini

[parameters]
    server="int"
Run Code Online (Sandbox Code Playgroud)

然后,在内核中,根据该值加载其他配置文件.例如,我喜欢这个工作,但它没有(因为容器在这一步还不存在)

应用程序/ 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');
  }
}
Run Code Online (Sandbox Code Playgroud)

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

感谢阅读,如果有什么问题让我知道.

编辑

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

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

Pet*_*ley 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 );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

应用程序/配置/ parameters.ini

[parameters]
    # ...
    server.env="int"
    server.title="Integration"
    server.name="Int 1"
Run Code Online (Sandbox Code Playgroud)

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

感谢那些读过这篇文章的人 - 我原本想到了一些更为复杂的东西,这使得这个简单的解决方案在一段时间内不可见;)