
升级 Symfony 至 4.4 时,ExecutionContextFactory 因构造方法缺少 TranslatorInterface 类型提示导致 autowire 失败,需显式添加类型声明并引入正确接口。
升级 symfony 至 4.4 时,`executioncontextfactory` 因构造方法缺少 `translatorinterface` 类型提示导致 autowire 失败,需显式添加类型声明并引入正确接口。
在 Symfony 4.4 中,依赖注入容器的自动绑定(autowiring)机制严格依赖 PHP 类型提示(type hints)来解析服务依赖。而 Symfony\Component\Validator\Context\ExecutionContextFactory 的构造方法在早期版本中仅使用 PHPDoc 注解声明 $translator 参数类型(如 @param TranslatorInterface $translator),但未添加实际的 PHP 7+ 类型声明,导致容器无法推断其应注入哪个服务(例如 translator),从而抛出:
Cannot autowire service "Symfony\Component\Validator\Context\ExecutionContextFactory": argument "$translator" of method "__construct()" has no type-hint...
⚠️ 注意:该类位于 Symfony 核心组件中(symfony/validator),你不应直接修改 vendor 文件——此错误通常表明你正在运行一个不兼容的旧版 validator 组件,或项目中存在版本冲突。
✅ 正确解决方案是确保使用与 Symfony 4.4 完全兼容的 symfony/validator 版本(即 v4.4.x),该版本已修复此问题:其 ExecutionContextFactory::__construct() 方法已正确定义类型提示:
use Symfony\Contracts\Translation\TranslatorInterface;
// ✅ Symfony 4.4.0+ 中的标准实现(无需手动修改)
public function __construct(TranslatorInterface $translator, string $translationDomain = null)
{
$this->translator = $translator;
$this->translationDomain = $translationDomain;
}
? 操作步骤如下:
-
检查当前 validator 版本:
composer show symfony/validator
确保输出为 v4.4.*(如 v4.4.45)。若显示 v3.x 或 v4.3.x,说明版本不匹配。
-
强制更新 validator 及相关组件:
composer update "symfony/validator" "symfony/translation" "symfony/framework-bundle" --with-dependencies
-
确认 TranslatorInterface 引用正确:
Symfony 4.4 起,推荐使用契约接口 Symfony\Contracts\Translation\TranslatorInterface(而非旧的 Symfony\Component\Translation\TranslatorInterface)。确保你的自定义服务或测试中也使用该契约:use Symfony\Contracts\Translation\TranslatorInterface; class MyService { public function __construct(private TranslatorInterface $translator) {} } -
清理缓存(尤其测试环境):
php bin/console cache:clear --env=test
? 额外提示:
- 若使用 --no-dev 安装或 CI 环境中依赖未完整加载,可能导致 symfony/translation 组件缺失,进而使 TranslatorInterface 不可用,请检查 composer.json 是否包含 "symfony/translation": "^4.4"(或由 framework-bundle 正确约束)。
- 避免在 config/services.yaml 中为 ExecutionContextFactory 手动配置 arguments —— 正确版本下 autowiring 应开箱即用。
完成上述步骤后,测试将不再因 autowiring 失败而中断,ExecutionContextFactory 将自动注入默认 translator 服务,符合 Symfony 4.4 的设计规范与最佳实践。











