设想:
- 我将依赖注入组件用作独立组件。没有捆绑包/symfony 框架之类的东西。
- 我有一组服务都负责类似的事情,例如通过不同的方式将数据写入硬盘(例如通过 ftp、直接文件操作、存储到数据库中,...)
- 这些服务中的每一个都需要不同的配置(例如 sql 凭据、ftp 凭据……)
- 我想将其中一项服务定义为其他服务依赖的“通用服务”。
- 使用哪个服务由参数配置
例子:
鉴于这些简化的参数和服务定义:
<parameter key="file.adapterType">direct</parameter>
<service id="file.db" />
<service id="file.ftp" />
<service id="file.direct" />
我想为我真正想要使用的服务定义一个别名
<service id="file.adapter" alias="file.%file.adapterType%"/>
对于仅依赖此服务的其他服务:
<service id="photos">
<argument type="service" id="file.adapter" />
</service>
到目前为止我已经尝试过:
- 使用别名 ID 中的参数定义别名。但是 alias-id 中的参数没有得到解析。
直接在参数标签中定义 id - 再次参数没有解析她:
<service id="photo"> <argument type="service" id="file.%file.adapterType%" /> </service>
创建工厂。get-method接收参数和di-container并返回相应的服务:
public function get(ContainerInterface $container, $parameter) { return $container->get('file.' . $parameter); }
但是,容器不会将自己注册为服务。从文件加载配置时,预先注册它不会生效(导致错误消息“服务'容器'未找到”):
$container->set("container", $container); $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/services')); $loader->load('fileadapter.xml'); // << gives error $container->get("container"); // << working
其他选择?
加载配置文件后我无法设置别名,因为文件中存在依赖别名的服务。
有人对如何处理这个问题有其他想法吗?