Symfony 3.4 ServiceNotFoundException:控制器无依赖却报缺失Serializer服务
别担心,这个错误看起来有点误导人,但根源其实很清晰——是依赖链的传递导致的,不是你的FormController直接依赖Serializer。让我一步步帮你理清楚:
问题根源
你的依赖链是这样的:FormController → SubscriberService → SubscriberRepository
而你在services.yml里明确给SubscriberRepository注入了Symfony\Component\Serializer\Serializer服务,但在Symfony 3.4中,这个Serializer服务默认不会自动注册到容器中,所以当容器尝试解析FormController的依赖树时,找不到Serializer服务,就把错误抛到了顶层的FormController上,才会出现这个看似不合逻辑的提示。
修复步骤
1. 确保Serializer组件已安装
首先检查你的composer.json里有没有symfony/serializer和symfony/property-access这两个包(3.4版本的Serializer需要property-access来支持对象序列化),如果没有,执行以下命令安装:
composer require symfony/serializer symfony/property-access
2. 在容器中定义Serializer服务
Symfony 3.4不会自动配置Serializer服务,你需要手动在services.yml里添加这个服务的定义:
services: # ... 其他服务配置 ... Symfony\Component\Serializer\Serializer: arguments: - '@serializer.normalizer.object' - ['@serializer.encoder.json']
或者更灵活一点,使用框架的默认配置(如果你的config/packages/framework.yml存在的话),添加:
framework: # ... 其他框架配置 ... serializer: enabled: true
这会自动帮你注册Serializer相关的默认服务。
3. 验证依赖链配置
确认你的SubscriberService确实正确注入了SubscriberRepository——看你的services.yml配置,这部分是没问题的:
AppBundle\Service\SubscriberService: arguments: $validator: '@Symfony\Component\Validator\Validator\ValidatorInterface' $subscriberRepository: '@AppBundle\Repository\SubscriberRepository'
额外提示
如果你不需要在SubscriberRepository里使用Serializer,可以直接移除那个注入项,这样也能解决问题——但如果是业务需要用到,就按上面的步骤配置Serializer服务即可。
内容的提问来源于stack exchange,提问作者Dariux

