私人服务和Symfony 4

时间:2018-07-17 09:05:22

标签: php symfony

我正在尝试将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 个答案:

答案 0 :(得分:1)

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

1。在services_test.yaml文件夹中添加config,内容如下:

services:
  _defaults:
    public: true

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

2。现在您可以从容器中获得服务了

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

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