Symfony 4.4起FlattenException移至symfony/error-handler,需更新命名空间并替换组件;TranslatorInterface新增$locale参数;PHP路由须显式设defaults和requirements;Doctrine迁移需升级元数据加载器并验证schema。

symfony/debug 被移除后,FlattenException 找不到了怎么办
Symfony 4.4 起 symfony/debug 组件被正式弃用,5.0 完全移除 —— 这意味着你项目里所有 use Symfony\Component\Debug\Exception\FlattenException; 都会报错。这不是路径写错,是类真没了。
必须改用 symfony/error-handler 提供的新位置:
- 旧写法:
use Symfony\Component\Debug\Exception\FlattenException; - 新写法:
use Symfony\Component\ErrorHandler\Exception\FlattenException; - 同时执行:
composer remove symfony/debug和composer require symfony/error-handler
注意:如果你自定义了异常处理逻辑(比如日志格式化、HTML异常页),别只换命名空间 —— FlattenException 构造行为有细微变化,建议检查 getTrace() 和 getAllPrevious() 的返回结构是否仍符合预期。
TranslatorInterface 实现类在升级后报“must implement”错误
Symfony 5.0 把 TranslatorInterface 的签名收紧了,尤其是 trans() 方法新增了第四个参数 $locale(可为 null),老实现类如果没声明它,PHP 会直接拒绝加载。
常见错误信息:Declaration of App\Translation\MyTranslator::trans() must be compatible with Symfony\Contracts\Translation\TranslatorInterface::trans()
- 补全方法签名:
public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string - 若你用的是
symfony/translation4.x 的旧扩展方式(如继承Translator),请改用组合模式 —— 直接依赖TranslatorInterface,而不是继承具体类 - Rector 可自动修复:启用
SymfonySetList::SYMFONY_50规则集后运行vendor/bin/rector process src --dry-run,能批量补全参数
路由配置从 YAML 搬到 PHP 后,path 参数解析出错
Symfony 5 强推 PHP-based 路由定义(config/routes.php),但很多老项目 YAML 里用了动态占位符,比如 path: /{lang}/{slug},迁移到 PHP 后容易漏掉 requirements 或 defaults 声明,导致匹配失败或 404。
- YAML 中隐式生效的
_locale默认值,在 PHP 路由中必须显式写:->defaults(['_locale' => 'en']) - 正则约束不能省:
->requirements(['lang' => '[a-z]{2}']),否则{lang}会接受任意字符串,可能破坏路由优先级 - 特别注意:PHP 路由文件里不能用
%kernel.project_dir%等容器参数 —— 它们在路由编译期不可用;要用__DIR__或硬编码相对路径
doctrine:migrations:migrate 执行失败,提示 “no migrations to execute”
这是老旧项目迁移中最隐蔽的坑:Doctrine Migrations 在 Symfony 5+ 默认使用 Doctrine\Migrations\Version\Loader\PhpFileVersionLoader,而老项目往往用的是 Doctrine\DBAL\Migrations\Version(v1.x 风格)—— 两者元数据表结构不兼容,migration 文件也不互通。
- 先确认当前 migration 版本:
php bin/console doctrine:migrations:status。如果输出里有Version 1.x字样,说明还在旧体系 - 安全做法:导出现有数据库结构为 SQL,新建空库,再用
php bin/console make:migration生成初始迁移,然后手动把老表结构 COPY 进去 - 切勿直接运行
php bin/console doctrine:migrations:sync-metadata-storage—— 它会清空现有 migration 记录,导致线上环境无法回滚
真正麻烦的不是命令跑不通,而是你以为迁完了,结果某个关联字段的 ON DELETE CASCADE 在新 migration 里根本没生成 —— 因为老 Doctrine DBAL 版本压根不识别这个语法。动手前,一定用 php bin/console doctrine:schema:validate 对比新旧 schema 差异。










