非共享服务中“您请求了一项不存在的服务”

问题描述 投票:0回答:1

我有两个名为“处理器”的服务:

<?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
    构造函数中,错误就会消失。

对于非共享服务,肯定有一些我不知道的事情,但我无法弄清楚到底是什么。

php symfony
1个回答
0
投票

该服务是自动连接的。您的项目中无需使用此代码。

我确实检查了你的 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 命令。

© www.soinside.com 2019 - 2024. All rights reserved.