Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 私人服务和Symfony 4_Php_Symfony - Fatal编程技术网

Php 私人服务和Symfony 4

Php 私人服务和Symfony 4,php,symfony,Php,Symfony,我正在尝试将我的Symfony 3.4应用程序迁移到Symfony 4.1 测试不起作用,因为默认情况下服务是私有的(这是个好消息) 在这篇文章之后,我仍然面临着私人服务的问题: Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:“my.service”服务或别名在编译容器时已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖项注入 在以下编译器过程中,在$definitions中找不到我的

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

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

在这篇文章之后,我仍然面临着私人服务的问题:

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

在以下编译器过程中,在
$definitions
中找不到我的私有服务:
供应商/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');
    }
//...
}

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

1.在
config
文件夹中添加
services\u test.yaml
,内容如下:

services:
  _defaults:
    public: true

  test.my.service: "@my.service"
2.现在您可以从您的容器中获得服务:

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

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

欢迎使用堆栈溢出。请将service.yml的相关部分添加到您的问题中,以便我们可以查看回答您的问题所需的信息。此外,如果控制器是一个特定的功能,您应该添加失败的控制器功能。您是否尝试将此服务注入其他地方?如果是这样,您只需将其声明为public:(只需将public设置为true)不,该服务应保持私有,我们通过依赖注入使用该服务。不使用容器。我们只在单元测试中使用容器。为此,我遵循了帖子:A应该足够了。如果你真的需要这项服务,那么你的架构就有问题。这实际上是一个有趣的问题。将所有内容设置为公共的编译器测试通过可能是最好的选择。您发现了原因:RemoveUnusedDefinitionsPass自上一版本以来就存在。此编译器过程将删除所有未使用的私有服务。我正在尝试在一个库上运行测试,该库将用于多个应用程序。这个图书馆有很多服务,但没有注入。以前,这些服务是公共的,在4.*中是私人的。当我尝试运行单元测试时,这些服务被删除,因为没有使用。谢谢。请注意,正确的yaml键是
\u defaults
,而不是
\u default