Symfony 2 - 多服务器配置

20
我们开始在工作中采用Symfony 2,这很好,但我正在努力解决一个挑战,我几乎解决了,但还没完全解决。Symfony将环境的概念视为单个服务器上的单独运行时。这很棒,因为您可以随心所欲地使用不同的前端控制器(web)或使用env开关(cli)之间切换运行时。
但是,我们的代码作为开发流程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过Integration、QA、Staging最终传播到Production。
因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标:
1. 在运行时环境切换方面维护Symfony的ootb功能。 2. 允许每个服务器进行公共(即开发人员控制的)配置。 3. 维护每个服务器的私有(即系统管理员控制的)配置。 4. 希望适用于Web和CLI。
这意味着我们不能完全依赖于parameters.ini或任何静态命名文件,因为开发人员需要控制每个服务器的配置,而且所有这些文件都将位于git中的相邻位置。
因此,我想要做的是添加一个新值到parameters.ini,设置服务器环境。例如:app/config/parameters.ini
[parameters]
    server="int"

在内核中,根据该值加载额外的配置文件。例如,我希望这个工作但是它不起作用(因为容器在此步骤中尚不存在)。

app / 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)配置值。

感谢阅读,如果有任何不清楚的地方请让我知道。

编辑

为了澄清,我不能使用或依赖以下内容:

  • 来自用户配置文件或通过export的*nix环境变量。为什么?集成、QA和Staging都可能在同一台机器上。
  • vhost配置中的任何内容(对cli无效)
  • 静态命名的文件(即仅命名为server.ini之类的文件无法工作)

你为什么认为需要使用Symfony2环境来处理服务器环境? - hakre
我并不是这样的。我只是在尝试找出最佳方法来加载每个服务器配置,同时仍然受开发人员控制。 - Peter Bailey
你仍然可以使用parse_ini_file方法解析parameters.ini。虽然我没有清楚地理解你的问题。你是说每个服务器配置文件都会有不同的路由/安全配置吗? - Mun Mun Das
你可以在下面阅读我的解决方案。这是一个难以描述的场景,希望解决方案能让它更清晰明了。 - Peter Bailey
1个回答

29

好的,我最终弄清楚了如何处理这个问题。实际上只需要对AppKernel进行基本修改即可。

app/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 );
    }
  }
}

app/config/parameters.ini

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

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

感谢那些阅读此内容的人 - 我最初想到的是一些更加复杂的东西,这让这个简单的解决方案在一段时间内变得不可见 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接