私人服务和 Symfony 4

Moh*_*ira 5 php symfony

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

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

在这篇文章之后:https://symfony.com/blog/new-in-symfony-4-1-simple-service-testing,我仍然面临着私人服务的问题:

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

在以下编译器传递中,未在以下位置找到我的私人服务$definitionsvendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php

应该是什么问题?

更新

这里的定义:

    <service id="my.service"
             class="My\Bundle\GreatService">
        <argument type="service" id="doctrine.orm.entity_manager" />
    </service>
Run Code Online (Sandbox Code Playgroud)

更新(再次)

这里是单元测试

<?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');
    }
//...
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*hev 3

奇怪的是上面的代码不起作用。当我使用 symfony 4.0 时,我使用了这样的技巧:

1.services_test.yamlconfig文件夹中添加以下内容:

services:
  _defaults:
    public: true

  test.my.service: "@my.service"
Run Code Online (Sandbox Code Playgroud)

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

$this->myService = self::$container->get('test.my.service')
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您是否在某处注入此服务,因为默认情况下会删除未使用的服务(如果它们不是公共或合成的)。

  • 您找到了原因:RemoveUnusedDefinitionsPass 自上一个版本以来就存在。并且此编译器会删除所有未使用的私有服务。我正在尝试在将在多个应用程序中使用的库上运行测试。这个库有很多服务但没有注入。以前,这些服务是公共的,而在 4.* 中是私有的。当我尝试运行单元测试时,这些服务因未使用而被删除。谢谢。 (2认同)