symfony环境变量配置核心是通过dotenv组件自动加载.env文件并分层覆盖,在yaml中用%env(...)%安全引用。具体为:第一步创建.env定义app_env、database_url等;第二步按.env→.env.{env}→.env.{env}.local优先级叠加;第三步在yaml中用%env(resolve:var)%等语法引用并类型转换;第四步用debug:dotenv等命令验证生效。

Symfony环境变量配置核心在于.env文件加载 + 环境感知覆盖 + YAML中安全引用,不是手动设全局变量,而是靠Dotenv组件自动注入并分层生效。
第一步:创建并填充.env基础文件
在项目根目录新建.env,用纯文本写入键值对(等号前后不加空格):
-
APP_ENV=dev—— 决定当前激活哪个环境(dev/test/prod) -
APP_SECRET=abc123...—— 加密、会话等必需的密钥 -
DATABASE_URL=mysql://root:pass@127.0.0.1:3306/myapp—— 数据库连接串 MAILER_DSN=smtp://user:pass@smtp.example.com:587
这些变量启动时自动进入$_ENV和$_SERVER,无需putenv()手动设置。
第二步:按优先级叠加本地与环境专用配置
Dotenv默认按顺序加载(后加载的覆盖前面同名变量):
-
.env—— 所有环境共享的基础配置(可提交到 Git) -
.env.local—— 本地开发覆盖项(如调试开关、自定义端口),必须加入.gitignore -
.env.dev/.env.prod—— 按APP_ENV值自动加载的环境专属配置 -
.env.dev.local/.env.prod.local—— 最高优先级,仅本机该环境生效
例如生产环境运行时,实际生效的是:.env → .env.prod → .env.prod.local逐层覆盖。
第三步:在YAML配置里安全引用环境变量
不要在config/packages/*.yaml里硬写密码或URL,改用%env(...)%语法:
-
database_url: '%env(resolve:DATABASE_URL)%'—— 自动解析字符串 -
secret: '%env(APP_SECRET)%'—— 直接取值 -
debug: '%env(bool:APP_DEBUG)%'—— 强制转布尔类型(true/false) -
max_items: '%env(int:MAX_ITEMS)%'—— 转整数
这种写法让配置保持干净,且类型转换失败会在cache:clear时报错,便于提前发现配置问题。
第四步:验证是否生效
执行命令检查环境变量是否被正确读取和解析:
-
php bin/console debug:dotenv—— 列出所有已加载的.env*文件及变量来源 -
php bin/console debug:container --env-var=DATABASE_URL—— 查看该变量最终值 -
php bin/console debug:config framework --env=prod—— 看框架配置中变量是否已展开
如果APP_ENV=prod但debug:dotenv没显示.env.prod,说明APP_ENV未被识别——检查是否漏了loadEnv()调用或.env格式有误(比如用了中文等号或空格)。











