構成情報と環境
==============

構成情報に対する典型的なアプローチには、いくつもの問題があります。

- チームの各メンバーは、自分自身の構成オプションを持っています。
  そのような構成をコミットすると、他のメンバーに影響を与えます。
- 本番のデータベースのパスワードと API キーは、レポジトリに入れるべきではありません。
- 複数のサーバ環境があります。すなわち、開発、テスト、本番などです。各サーバはそれ自身の構成情報を持たなければなりません。
- 全ての構成オプションをすべての場合について定義するのは非常に反復の多い作業であり、保守するのにも時間を取りすぎます。

これらの問題を解決するために、Yii は単純な環境の概念を導入しました。
それぞれの環境は `environments` ディレクトリ配下の一群のファイルとして表現されます。
`init` コマンドが環境を初期設定するのに使用されます。
`init` コマンドが実際にやっていることは、環境ディレクトリから、全てのアプリケーションがあるルートディレクトリへと、すべてをごっそりとコピーすることです。

デフォルトでは二つの環境があります。すなわち、`dev` と `prod` です。
最初のものは開発用の環境で、全ての開発ツールとデバッグが有効になっています。
第二のものは本番サーバ配備用の環境で、デバッグと開発ツールは無効になっています。

典型的には、環境ディレクトリは `index.php` のようなアプリケーションブートストラップファイルや、`-local.php` という接尾辞を持つ構成情報ファイルを含んでいます。
これらのファイルは、チーム・メンバーの個人的な構成情報 (通常は `dev` 環境に置きます) であるか、
特定のサーバの構成情報 (たとえば、本番環境のデータベース接続は `prod` 環境の `-local.php` 構成情報ファイルに置きます) であるかのどちらかです。
これらのローカルな構成情報は `.gitignore` に追加されており、ソースコードレポジトリには決してプッシュされません。

重複を避けるために、構成情報はお互いを上書きします。
例えば、フロントエンドは次の順序で構成情報を読み取ります。

- `common/config/main.php`
- `common/config/main-local.php`
- `frontend/config/main.php`
- `frontend/config/main-local.php`

パラメータは次の順序で読まれます。

- `common/config/params.php`
- `common/config/params-local.php`
- `frontend/config/params.php`
- `frontend/config/params-local.php`

後の構成情報ファイルが先のものを上書きするわけです。

全体の枠組みはこのようになります。

![アドバンストアプリケーションの構成情報](images/advanced-app-configs.png)
