Symfony非共享服务报错:请求不存在的ChannelRepository服务
Symfony非共享服务引发的依赖注入问题
我有两个处理器服务:
<?php namespace App\Processor; use App\Repository\ChannelRepository; use Psr\Log\LoggerInterface; class FirstProcessor { public function __construct( LoggerInterface $logger, ChannelRepository $channelRepository, ) { } }
<?php namespace App\Processor; use App\Repository\ChannelRepository; use Psr\Log\LoggerInterface; class SecondProcessor { public function __construct( //LoggerInterface $logger, ChannelRepository $channelRepository, ) { } }
此外,我有一个设为公开非共享服务的Action,依赖上述处理器:
<?php namespace App\Action; use App\Processor; class CheckEmail { public function __construct( \App\Processor\FirstProcessor $firstProcessor, \App\Processor\SecondProcessor $secondProcessor, ) { } }
还有一个依赖这个CheckEmail Action的控制台命令:
<?php #[AsCommand('app:check-inbox', 'Check inbox and process emails')] class CheckInboxCommand extends Command { protected CheckEmail $action; public function __construct( CheckEmail $command ) { parent::__construct(); } }
现在我遇到了错误:You have requested a non-existent service 'App\Repository\ChannelRepository'。但这个Doctrine仓库ChannelRepository明明存在,而且Symfony DI已经正常识别它两年了,现在突然找不到。我已经简化了代码来定位问题,复现步骤是执行composer install、symfony serve后打开本地服务即可(需要PHP8.1)。
我总结了几个能让错误消失的情况:
- 将
App\Action\CheckEmail改为共享服务(注释services.yaml中的shared: false); - 注释
FirstProcessor构造函数中的$logger参数; - 在另一个服务(比如DevController)的构造函数中也注入
CheckEmail(同时保留控制台命令中的注入); - 把
CheckEmail从控制台命令的构造函数移到DevController的构造函数中。
我肯定是对非共享服务的某些机制理解不到位,希望有人能解释这个问题。
内容的提问来源于stack exchange,提问作者unnamed777
相关产品推荐
相关产品推荐

