Symfony 4.4无法将指定自定义服务设置为公开的问题
Symfony 单独设置服务为public:true不生效的解决方案
问题根源
你遇到的问题大概率是服务配置顺序导致的覆盖,或者测试环境配置冲突。Symfony处理服务配置时,后加载的配置会覆盖之前的定义,如果你的单独服务配置放在自动导入规则之前,自动导入生成的默认配置(继承_defaults的public: false)会覆盖你手动设置的public: true。
解决方案
1. 调整服务配置顺序
确保单独的TokenService配置放在自动导入规则之后。修改config/services.yaml如下:
# config/services.yaml services: # default configuration for services in *this* file _defaults: autowire: true # Automatically injects dependencies in your services. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. # 自动导入所有Service目录下的服务(这部分通常在默认配置里) App\Service\: resource: '../src/Service/' autowire: true autoconfigure: true # 单独配置TokenService,必须放在自动导入规则之后 App\Service\Common\TokenService: public: true
2. 检查测试环境配置
单元测试使用的是test环境,需确认config/packages/test/services.yaml中没有覆盖该服务的public属性。如果测试环境的_defaults设置了public: false,且没有单独为TokenService例外,会覆盖主配置的设置。
在config/packages/test/services.yaml中添加单独配置:
# config/packages/test/services.yaml services: App\Service\Common\TokenService: public: true
3. 清除测试环境缓存
修改配置后,务必清除测试环境的缓存,避免旧配置残留:
php bin/console cache:clear --env=test
验证结果
执行以下命令检查服务状态:
php bin/console debug:container App\Service\Common\TokenService --env=test
此时Public属性应显示为yes,单元测试中Mock该服务即可正常执行。
内容的提问来源于stack exchange,提问作者naspy971
相关产品推荐
相关产品推荐

