対象: Symfony 7.4(symfony/dotenv のソースで確認)

定義ファイルと読み込み順

Symfony は .env 系ファイルを次の順に読み込み、後から読み込んだものが前の値を上書きします。

ファイル 内容 Git
1 .env アプリが必要とする環境変数の既定値 コミットする
2 .env.local ローカル環境での上書き コミットしない
3 .env.$APP_ENV 環境ごとの既定値 コミットする
4 .env.$APP_ENV.local 環境ごとのローカル上書き コミットしない

[!IMPORTANT]

  • APP_ENV=test のときは .env.local を読み込みません(テスト結果を開発者間で揃えるため)。.env.test.local は読み込まれます。
  • 対象ファイルが存在しなければスキップされます。

優先順位

.env < .env.local < .env.$APP_ENV < .env.$APP_ENV.local < (シェル・OS 側の)実環境変数
  • 実環境変数(シェルで export した値、コンテナ・PaaS に設定した値など)は、.env 系ファイルの値より常に優先されます。
  • 実環境変数が存在すればそれを参照し、存在しなければ .env 系ファイルの値を参照します。

環境変数の使用

設定ファイルで %env(...)% として参照できます。

# config/services.yaml
parameters:
    sample_application_id: '%env(SAMPLE_ID)%'
    sample_application_secret: '%env(SAMPLE_SECRET)%'

コンストラクタで直接受け取る場合は #[Autowire] も使えます。

use Symfony\Component\DependencyInjection\Attribute\Autowire;

public function __construct(
    #[Autowire(env: 'SAMPLE_ID')] private readonly string $sampleId,
) {
}

型変換などは Environment Variable Processorsint / bool / json / default などを使います。

秘匿情報の扱い

[!WARNING] .env.env.$APP_ENVコミットされるファイルです。パスワード・API キー・シークレットなどの実際の値を書かないでください。

  • ローカルだけで使う値は .env.local(Git 管理外)に書く
  • 本番の秘匿情報は Symfony Secretsbin/console secrets:set)や、実行基盤のシークレット管理機能から実環境変数として注入する

本番運用: .env を PHP 配列に変換する

本番では、リクエストごとに .env をパースしないよう、事前に .env.local.php へ変換することが推奨されています。

composer dump-env prod

.env.local.php が存在する場合、.env 系ファイルは読み込まれず、このファイルの値が使われます(実環境変数は引き続き優先されます)。値を変更したら再実行が必要です。

ドキュメント