You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:37:33