【问题标题】:Private service and Symfony 4私人服务和 Symfony 4
【发布时间】:2018-12-24 21:58:45
【问题描述】:

我正在尝试将我的 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');
    }
//...
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请将您的 service.yml 的相关部分添加到您的问题中,以便我们可以看到回答您的问题所需的信息。另外,如果是特定的控制器,您应该添加失败的控制器的功能。
  • 您是否尝试将此服务注入其他地方?如果是这样,您只需将其声明为 public :symfony.com/doc/current/service_container/…(只需将 public 设置为 true)
  • 不,服务应该保持私有,我们通过依赖注入使用了这个服务。不使用容器。我们仅在单元测试中使用容器。为此,我关注了帖子:symfony.com/blog/new-in-symfony-4-1-simpler-service-testing
  • 一个PHPUnit Mock 应该足够了。如果您确实需要该服务,那么您的架构就有问题。
  • 这实际上是一个有趣的问题。 Some discussion here。将所有内容设置为公开的测试编译器通过可能是最好的选择。

标签: php symfony


【解决方案1】:

奇怪的是上面的代码不起作用。当我使用 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')

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

【讨论】:

  • 您找到了原因:RemoveUnusedDefinitionsPass 自上一版本以来就存在。并且此编译器通过删除所有未使用的私有服务。我正在尝试在将用于多个应用程序的库上运行测试。这个库有很多服务但没有注入。以前,这些服务是公开的,在 4.* 中是私有的。当我尝试运行单元测试时,这些服务因未使用而被删除。谢谢。
  • 只需说明正确的 yaml 密钥是 _defaults,而不是 _default
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多