app_env=prod但debug=true说明环境变量未真正传入php进程或被覆盖;symfony仅依赖执行时shell变量,需用app_env=prod php bin/console命令而非弃用的--env参数,并验证debug:dotenv输出。

APP_ENV=prod 但 debug=true 还在生效
这说明环境变量没真正传进 PHP 进程,或者被后续配置覆盖。Symfony 不读取 .env 文件里的 APP_ENV 来决定运行时环境——它只靠执行命令那一刻的 shell 环境变量。
常见错误现象:php bin/console cache:clear 清的是 dev 缓存,哪怕你刚改了 .env;访问页面仍显示 Symfony 调试工具栏。
- 必须前置设置:用
APP_ENV=prod php bin/console cache:clear,而不是php bin/console --env=prod cache:clear(该参数已弃用) - 检查是否在
public/index.php或bin/console里硬编码了$_ENV['APP_ENV'] = 'dev'类逻辑 - 运行
php bin/console debug:dotenv,确认输出中APP_ENV的值和来源(比如来自.env.local还是 shell)
dotenv:dump 后 .env.local.php 没被加载
生产环境跳过 .env 解析是性能优化手段,但前提是 .env.local.php 必须存在且能被 Dotenv::bootEnv() 自动识别。它不会自己“冒出来”,也不会覆盖已有变量。
常见错误现象:部署后 DATABASE_URL 为空、APP_DEBUG 仍是 true;debug:dotenv 显示 “No environment file loaded”。
-
.env.local.php必须放在项目根目录(和.env同级),不能放错位置 - 确保生成时用了对应环境:本地执行
php bin/console dotenv:dump --format=php --env=prod,不是--env=dev - 检查
public/index.php开头是否有Dotenv::bootEnv()调用,且未被注释或条件跳过 - 如果用了自定义入口文件(如 Docker 中替换过),要确认它也调用了
bootEnv()
translation.yaml 配置写了但 trans() 不翻译
翻译不生效,90% 是资源没加载进来,不是模板写法错了。Symfony 的 Translator 默认只加载 messages.* 域,且路径、格式、命名必须严丝合缝。
常见错误现象:{{ 'hello'|trans }} 始终返回 hello;debug:translation zh-CN 显示 “no messages found”。
- 确认
config/packages/translation.yaml里有default_path: '%kernel.project_dir%/translations',且该目录真实存在 - 文件必须叫
messages.zh-CN.xlf(XLIFF)或messages.zh-CN.yaml(YAML),不能是zh_CN或zh-cn(大小写敏感) - XLIFF 文件里
<file target-language="zh-CN"></file>的属性值必须和文件名后缀一致 - 运行
php bin/console debug:translation zh-CN,看是否列出键值;若无输出,说明文件路径/命名/格式三者至少一个不匹配
服务构造参数注入 null 或报类型错误
看起来是参数“空”,实际是容器根本没找到可注入的对象。自动装配(autowire)不是魔法,它依赖类型提示 + 可用服务 ID 的严格匹配。
常见错误现象:自定义服务构造函数接收 MailerInterface $mailer,但运行时报 Cannot resolve argument $mailer;或注入了 null 导致后续调用失败。
- 检查
services.yaml是否启用了autowire: true和autoconfigure: true,且resource: '../src/'覆盖到你的类所在目录 - 运行
php bin/console debug:container --types,搜索MailerInterface,确认有对应服务 ID(如mailer.default) - 标量参数(如
string $apiHost)不会自动装配,必须显式绑定:bind: { $apiHost: '%env(API_HOST)%' } - 如果接口有多个实现,容器无法决定选谁,要么删掉一个,要么用
bind:强制指定
APP_ENV、APP_DEBUG、DATABASE_URL 这些关键变量,必须从 shell 层穿透到 Dotenv::bootEnv() 再透到容器,中间任一环节断开,就只剩默认值撑场面。











