如何仅替换Symfony服务类而保留其他配置不变?
问题描述
我需要修改Symfony服务中的几行代码(目标是在5.4版本中使用6.2版本新增的功能/修复的bug),于是将该服务类复制到自己项目中修改后,在services.yml里替换类:
messenger.senders_locator: class: 'App\Overwrites\Symfony\SendersLocator'
但出现如下错误:
Cannot autowire service "messenger.senders_locator": argument "$sendersMap" of method "App\Overwrites\Symfony\SendersLocator::__construct()" is type-hinted "array", you should configure its value explicitly.
$sendersMap是原服务自动生成的参数,重新创建它工作量极大,请问如何让Symfony仅替换服务类,而保留该服务的其他所有配置?
解决方案
通过
parent字段继承原服务配置
在services.yml中配置自定义服务时,添加parent字段指向原服务,即可继承其所有配置(包括自动生成的参数、依赖项等),仅替换类:messenger.senders_locator: parent: 'messenger.senders_locator' class: 'App\Overwrites\Symfony\SendersLocator'这样Symfony会复用原服务的全部配置逻辑,只将服务类替换为你的自定义实现,自动沿用原有的
$sendersMap参数及其他依赖。保证自定义类构造函数与原服务一致
确认你的App\Overwrites\Symfony\SendersLocator构造函数的参数签名和Symfony原服务完全匹配,这样才能正确继承所有依赖注入项。如果原服务构造函数有变动,需同步调整自定义类的构造函数。清除Symfony缓存
修改服务配置后,执行命令php bin/console cache:clear,确保Symfony加载更新后的服务配置。
内容的提问来源于stack exchange,提问作者HubertNNN
相关产品推荐
相关产品推荐

