我有两个名为“处理器”的服务:
<?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,
) {
}
}
我还有一个操作,它是一个公共非共享服务,它使用这些处理器:
<?php
namespace App\Action;
use App\Processor;
class CheckEmail
{
public function __construct(
\App\Processor\FirstProcessor $firstProcessor,
\App\Processor\SecondProcessor $secondProcessor,
) {
}
}
以及依赖于 CheckEmail 操作的控制台命令:
<?php
#[AsCommand('app:check-inbox', 'Check inbox and process emails')]
class CheckInboxCommand extends Command
{
protected CheckEmail $action;
public function __construct(
CheckEmail $command
)
{
parent::__construct();
}
}
不知何故,我开始收到错误“您请求了一个不存在的服务“App\Repository\ChannelRepository””。当然,
ChannelRepository
(Doctrine 存储库)存在,并且 Symfony DI 已经看到它两年了,但是发生了一些事情,现在 DI 找不到它。一开始,代码是一个包含大量控制器和服务的大项目。为了找到问题所在,我删除了除导致问题的几个类之外的所有内容。完整的简化代码可在 github 上找到(composer install
、symfony serve
并打开 https://127.0.0.1:8000 应该足以重现该问题;需要 php81)。
我发现了一些模式:
App\Action\CheckEmail
被共享(在 services.yaml 中注释为“shared: false”),错误就会消失。$logger
constructor中评论
FirstProcessor
,错误就会消失。CheckEmail
(并将其保留在CheckInboxCommand
的构造函数中),错误就会消失。 例如,取消注释 $action
中的 DevController
即可解决问题。CheckEmail
构造函数中删除 CheckInboxCommand
并将其添加到 DevController
构造函数中,错误就会消失。对于非共享服务,肯定有一些我不知道的事情,但我无法弄清楚到底是什么。
该服务是自动连接的。您的项目中无需使用此代码。
我确实检查了你的 github 代码并通过简单地删除此表单服务使其正常工作。
App\Action\CheckEmail:
public: true
shared: false
您的示例中无需设置此配置
我也改变了doctrine.yaml
mappings:
App:
is_bundle: false
dir: '%kernel.project_dir%/src'
prefix: 'App\'
alias: App
另外,在测试此配置之前,不要忘记运行 bin/console cache:clear 命令。