私有服务和Symfony 4

6

我正在尝试将我的Symfony 3.4应用程序迁移到Symfony 4.1。

测试不起作用,因为服务默认为私有(这是一个好消息)。

根据这篇文章:https://symfony.com/blog/new-in-symfony-4-1-simpler-service-testing,我仍然面临着私有服务的问题:

Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:当容器被编译时,“my.service”服务或别名已被删除或内联。您应该将其公开,或停止直接使用容器并改用依赖注入。

在以下编译器传递中,我的私有服务未在$definitions中找到:vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php

问题应该是什么?

更新

这里是定义:

    <service id="my.service"
             class="My\Bundle\GreatService">
        <argument type="service" id="doctrine.orm.entity_manager" />
    </service>

更新(再次)

这里是单元测试

<?php

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class MyServiceTest extends KernelTestCase
{
    protected $myService;

    public function setUp()
    {
        self::bootKernel();

        $this->myService = self::$container->get('my.service');
    }
//...
}

1
欢迎来到Stack Overflow。请将您的service.yml文件中相关部分添加到问题中,以便我们查看回答问题所需的信息。如果控制器有特定的功能失败,请也一并添加。 - KhorneHoly
你是在尝试将这个服务注入到其他地方吗?如果是的话,你只需要将其声明为公共服务:https://symfony.com/doc/current/service_container/alias_private.html#marking-services-as-public-private(将public设置为true即可)。 - Snroki
不,该服务应保持私有,并且我们通过依赖注入使用了该服务。不使用容器。我们仅在单元测试中使用容器。为此,我遵循了这篇文章:https://symfony.com/blog/new-in-symfony-4-1-simpler-service-testing - Mohammed Mehira
一个 PHPUnit Mock 应该足够了。如果你真的需要这个服务,那么你的架构可能存在问题。 - fxbt
1
这实际上是一个有趣的问题。这里有一些讨论。编译器通过测试并将所有内容设置为公共可能是最好的选择。 - Cerad
1个回答

3

很奇怪上面的代码不起作用。当我使用 symfony 4.0 时,我使用了如下技巧:

1.在 config 文件夹中添加名为 services_test.yaml 的文件,并添加以下内容:

services:
  _defaults:
    public: true

  test.my.service: "@my.service"

2.现在你可以从容器中获取服务:

$this->myService = self::$container->get('test.my.service')

顺便问一下,您是否将此服务注入到某个地方,因为未使用的服务默认会被删除(如果它们不是公共或合成服务)。


2
您找到了原因:RemoveUnusedDefinitionsPass 从之前的版本开始就存在。并且此编译器通过将删除所有未使用的私有服务。我正在尝试对一个将在多个应用程序中使用的库运行测试。这个库有很多服务,但没有被注入。以前,这些服务是公共的,在4.*中是私有的。当我尝试运行单元测试时,这些服务被删除,因为它们没有被使用。谢谢。 - Mohammed Mehira
1
只是想提醒一下,正确的 YAML 键名应该是 _defaults,而不是 _default - fxbt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接