20

私たちはここで仕事中のプロジェクトに Symfony 2 を採用し始めています。これは素晴らしいことですが、私が解決しようとしている課題があります。

symfony は、環境の概念を単一サーバー上の個別のランタイムとして扱います。これは、さまざまなフロント コントローラー (web) を使用してランタイムを切り替えたり、env スイッチ (cli) を気まぐれに使用したりできるため、優れています。

ただし、コードは開発プロセスの一環として多くのサーバーにデプロイされます。誰もがローカル VM を持っており、コードは統合、QA、ステージング、そして最後に本番環境に伝播します。

したがって、環境の概念はサーバー (仮想または物理) です。このカスタム構成の目標は次のとおりです

  1. ランタイム環境の切り替えに関して Symfony の ootb 機能を維持する
  2. サーバーごとにパブリック (つまり、開発者が制御する) 構成を許可する
  3. サーバーごとにプライベート (つまり、sysad 制御) 構成を維持する
  4. Web と CLI の両方で動作します

これは、開発者が各サーバーの構成を制御する必要があり、これらすべてのファイルが git で隣り合って存在するため、parameters.iniまたは静的に名前が付けられたファイルに 100% 依存することはできないことを意味します。

だから、私がやりたいはこれです。サーバー環境を設定する parameters.ini に新しい値を追加します。このようなもの

app/config/parameters.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、およびステージングは​​すべて同じボックスにある可能性があります
  • 仮想ホスト構成のすべて (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 );
    }
  }
}

app/config/parameters.ini

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

これで、必要に応じてapp/config/server/に%server.env%.ymlファイルを作成できるようになりました。

これを読んでくれた人たちに感謝します - 私は当初、この単純な解決策をしばらく見えなくするもっと複雑なことを考えていました;)

于 2012-04-04T18:54:11.723 に答える