環境変数 | Symfony7
対象: 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 Processors の int / bool / json / default などを使います。
秘匿情報の扱い
[!WARNING]
.envと.env.$APP_ENVはコミットされるファイルです。パスワード・API キー・シークレットなどの実際の値を書かないでください。
- ローカルだけで使う値は
.env.local(Git 管理外)に書く - 本番の秘匿情報は Symfony Secrets(
bin/console secrets:set)や、実行基盤のシークレット管理機能から実環境変数として注入する
本番運用: .env を PHP 配列に変換する
本番では、リクエストごとに .env をパースしないよう、事前に .env.local.php へ変換することが推奨されています。
composer dump-env prod
.env.local.php が存在する場合、.env 系ファイルは読み込まれず、このファイルの値が使われます(実環境変数は引き続き優先されます)。値を変更したら再実行が必要です。