20

我正在尝试将 SF 3.3 应用程序迁移到具有新目录结构和所有内容的 SF 4。

我在这个例外上苦苦挣扎:

编译容器时,“simplethings_entityaudit.reader”服务或别名已被删除或内联。您应该将其公开,或者直接停止使用容器并改用依赖注入。

(此服务来自位于 /vendor 的外部包)。

不过,当我bin/console debug:container simplethings_entityaudit.reader看到该服务存在并且是公开的时:

服务“simplethings_entityaudit.reader”的信息
==================================================== =======

 ----------------- --------------------------------- -----
  期权价值                                 
 ----------------- --------------------------------- -----
  服务 ID simplethings_entityaudit.reader       
  类 SimpleThings\EntityAudit\AuditReader  
  标签 -                                     
  公开 是                                   
  合成无                                    
  懒惰的不                                    
  共享 是                                   
  摘要无                                    
  自动接线没有                                    
  自动配置否                                    
  工厂服务 simplethings_entityaudit.manager      
  工厂方法 createAuditReader                     
 ----------------- --------------------------------- -----

该服务目前在我自己的一个中调用$this->container->get('simplethings_entityaudit.reader')

我也尝试注入SimpleThings\EntityAudit\AuditReader我的服务构造函数,但这是我得到的:

方法“__construct()”的参数“$auditReader”引用了类“SimpleThings\EntityAudit\AuditReader”,但不存在此类服务。它不能自动注册,因为它来自不同的根命名空间。

当我将它添加到我的services.yaml它的工作原理时,但我不需要这样做:

SimpleThings\EntityAudit\AuditReader:
    alias: simplethings_entityaudit.reader

有任何想法吗?

4

4 回答 4

16

就我而言,错误出现在单元测试中。

我有一个服务,无法在测试中加载(Symfony 4.2),而我项目中的所有其他服务都运行良好。

我已经清除了缓存,但它没有帮助。然后我创建了一个带有路由的简单控制器,并将服务作为方法参数注入。之后,该服务也在我的测试中起作用。

结论:如果你有单元测试,想测试你的服务,还必须提供服务注入的控制器,否则在测试服务容器中是不可用的。显式服务配置也可能有所帮助。

于 2019-03-25T12:47:45.657 回答
8

In Symfony 4.0, any service that does not specify its visibility is private, https://github.com/symfony/symfony/pull/24238.

As far as I can see, the service you mention does not specify the visibility: https://github.com/simplethings/EntityAuditBundle/blob/1.0/src/SimpleThings/EntityAudit/Resources/config/auditable.xml#L23-L26, so this is probably the reason for your exception.

If simplethings_entityaudit.reader service cannot be autowired (and this is probably because it uses a factory service), you can inject it into your own service by referencing it with @simplethings_entityaudit.reader notation as per this: https://symfony.com/doc/current/service_container.html#services-manually-wire-args, something like this:

services:
    My\Service:
        arguments:
            $auditReader: @simplethings_entityaudit.reader
于 2018-01-24T15:42:02.610 回答
2

在我们的例子中,我们制作了一个 services_test.yml 和 .env.test,并将 APP_ENV 设置为测试

然后在这个 services_test.yml 我们放置

服务:_defaults:公共:true

所以默认情况下所有服务都是公开的

不要忘记获取您的 .env 和 .env.test 我经常必须这样做,我们重新启动我的 VM

于 2020-12-18T11:02:12.043 回答
0

我有同样的问题,依赖注入和添加为服务对我不起作用。然后我发现别名是在 PHP 代码上设置的,并->setPublic(true)在那里添加解决了我的问题。

对我有帮助的参考网址: https ://symfony.com/doc/current/service_container/alias_private.html

use Symfony\Component\DependencyInjection\ContainerBuilder;

//...
public function load(ContainerBuilder $container)
{
    $container->setAlias('simplethings_entityaudit.reader', 'SimpleThings\EntityAudit\AuditReader')
              ->setPublic(true);
}
//...
于 2021-10-21T10:27:18.183 回答