我有一个由两个 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');
这些没有任何区别:
- 我更改了服务定义的顺序
- 两个应用程序都运行 Symfony 4.3.3
我认为这在配置方面是微不足道的,但我无法确定它(在尝试调试为什么框架将我的服务编译为私有的 2 小时后,我认为有人可能有这个并且可能会帮助我)。