Symfony多环境配置由APP_ENV变量驱动,通过.env→.env.local→.env.{env}→.env.{env}.local顺序加载覆盖,YAML中用%env(resolve:VAR)%安全引用并类型转换,确保配置隔离与安全。

安装 Symfony 后,多环境配置不是靠手动复制配置文件实现的,而是由 APP_ENV 变量驱动、.env 系统自动加载、YAML 中按需引用的一套协同机制。核心在于理解文件加载顺序、变量作用范围和配置生效时机。
.env 文件是基础配置源头
项目根目录下的 .env 是所有环境共享的起点,用于定义默认值,可提交到 Git:
-
APP_ENV=dev—— 决定当前激活哪个环境(dev/test/prod),必须存在 -
APP_SECRET=abc123—— 所有环境都需要的密钥,建议在 .env.local 中覆盖为更安全的值 -
DATABASE_URL=mysql://root:@127.0.0.1:3306/myapp—— 开发用数据库地址,生产环境应被替换 - 等号前后不加空格,不支持中文字符或 UTF-8 BOM,否则
debug:dotenv会报错
.env.local 是本地覆盖层(最高优先级)
.env.local 不进版本库,只在本机生效,用于覆盖敏感信息或调试设置:
- 它比
.env和.env.dev都优先,适合放本地数据库密码、调试开关 - 示例内容:
APP_DEBUG=true、DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db - 必须加入
.gitignore,避免密钥泄露 - 如果误删,
APP_ENV=prod却没读到.env.prod.local,很可能就是它缺失导致的
环境专用文件按 APP_ENV 自动加载
当 APP_ENV=prod 时,Symfony 会依次加载:.env → .env.prod → .env.prod.local,后加载的同名变量覆盖前面的:
-
.env.dev:仅 dev 环境加载,比如设MAILER_DSN=null://关闭邮件发送 -
.env.prod:生产环境共享配置,如TRUSTED_HOSTS=example.com -
.env.test:测试环境专用,常用于 CI 流程中固定行为 - 这些文件可提交到 Git,但不要在里面写密码或密钥
在 YAML 中安全引用环境变量
不要在 config/packages/*.yaml 里硬编码值,改用 %env()% 语法,确保类型正确、提前报错:
-
database_url: '%env(resolve:DATABASE_URL)%'—— 强制解析并校验格式 -
debug: '%env(bool:APP_DEBUG)%'—— 转布尔型,APP_DEBUG=off也会变成false -
max_retries: '%env(int:MAX_RETRIES)%'—— 转整数,非法值会在cache:clear时报错 - 漏掉
resolve:前缀会导致字符串字面量,不会真正读取环境变量

















