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