Symfony 3依赖注入报错:父类__construct()注入失败及参数不匹配
解决依赖注入类型错误:传入容器实例而非AccountService
这个错误的核心原因很明确:你的ShopService构造函数声明需要AccountService实例作为第一个参数,但在service.yml里你配置的却是把容器(@service_container)传进去了,类型完全不匹配,所以才会抛出这个错误。另外,因为ShopService继承了BaseService,你还得正确处理父类的依赖传递。
下面是分步修复方案:
1. 修正ShopService的构造函数
ShopService继承了BaseService,而BaseService的构造函数需要ContainerInterface和EntityManagerInterface,所以你需要在ShopService的构造函数中同时接收自己的依赖(AccountService)和父类的依赖,然后传递给父类的构造方法:
use App\Base\Service\AccountService; use App\Base\Service\BaseService; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; class ShopService extends BaseService { /** * @var AccountService */ private $accountService; /** * @param AccountService $accountService * @param ContainerInterface $container * @param EntityManagerInterface $em */ public function __construct(AccountService $accountService, ContainerInterface $container, EntityManagerInterface $em) { // 先调用父类构造函数,传入它需要的参数 parent::__construct($container, $em); // 再初始化自己的依赖 $this->accountService = $accountService; } // 示例方法:正确调用AccountService的方法 public function exampleMethod() { $this->accountService->getMyFunction(); } }
2. 更新service.yml配置
现在ShopService的构造函数参数顺序是:AccountService → ContainerInterface → EntityManagerInterface,所以你需要在配置中对应调整arguments,确保传入正确的服务实例:
# 先确保AccountService已经被配置为服务 app.account_service: class: App\Base\Service\AccountService arguments: ["@service_container", "@doctrine.orm.default_entity_manager"] public: true # 然后更新ShopService的配置 app.shop: class: App\Base\Service\ShopService arguments: ["@app.account_service", "@service_container", "@doctrine.orm.default_entity_manager"] public: true
3. 推荐:使用Symfony自动装配(更简洁)
如果你使用的是Symfony 3.4+,强烈建议开启自动装配,这样容器会自动解析构造函数的依赖,不需要手动写arguments,大大减少配置错误:
services: _defaults: autowire: true # 开启自动装配 autoconfigure: true public: false # 自动注册Base/Service下的所有服务 App\Base\Service\: resource: '../src/Base/Service/*' public: true
开启自动装配后,你甚至可以简化BaseService的构造函数(如果不需要容器的话,尽量避免直接注入容器,而是注入具体的依赖),让依赖注入更清晰。
内容的提问来源于stack exchange,提问作者Tommy J
相关产品推荐
相关产品推荐

