我有两个Symfony应用程序使用的库,该库定义了一组我想公开的服务(我希望能够直接通过容器检索它们。当我尝试访问一个服务时,我拥有这个:
在编译容器时,“ Library \ Service \ DerivedServices \ OneSpecificImplementation”服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器并改为使用依赖项注入。
问题在于,所述服务 被宣布为公开。
基本上有:
Library\Service\BaseService
类,它具有两个用于公共依赖项的设置器(此代码段中的学说和记录器); Library\Service\DerivedServices
名称空间中)每个都定义一个新服务(具有自己的构造函数以直接处理DI)。这是我的服务定义:
# Base: inject common dependencies
Library\Service\BaseService:
abstract: true
calls:
- [setDoctrine, ['@doctrine.orm.entity_manager']]
- [setLogger, ['@Library\Service\Logger']]
# These services are public to be retrieved directly by the container interface
Library\Service\DerivedServices\:
resource: '../vendor/company/library/src/Library/Service/DerivedServices'
public: true
autowire: true
autoconfigure: false
parent: Library\Service\BaseService
然后,Symfony应用程序检索一个派生服务,例如:
$this->get('Library\Service\DerivedServices\OneSpecificImplementation');
这些没有什么区别:
我认为这是一些琐碎的配置,但是我无法查明(在尝试调试框架为什么将我的服务编译为私有的两个小时之后,我认为有人可能对此有帮助,可能会帮我)
答案 0 :(得分:1)
事实证明,服务的声明顺序非常重要。如我所想,问题在于配置方面。
我有:
Library\Service\BaseService:
...
Library\Service\DerivedServices\:
...
Library\Service\:
resource: '../vendor/company/library/src/Library/Service'
最后一条指令将所有服务重新声明为私有服务(默认情况下)。
我将其更改为:
Library\Service\:
resource: '../vendor/company/library/src/Library/Service'
Library\Service\BaseService:
...
Library\Service\DerivedServices\:
...
这首先将所有服务声明为私有,然后使用新声明:使用parent + public重新声明它们。