4

设想:

  • 我将依赖注入组件用作独立组件。没有捆绑包/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
    

其他选择?

加载配置文件后我无法设置别名,因为文件中存在依赖别名的服务。

有人对如何处理这个问题有其他想法吗?

4

3 回答 3

1

实际上,我相信您在“到目前为止我已经尝试过的内容”部分中的第三个要点是正确的,除了服务容器确实将自己注册为服务,但它被称为service_container,而不是container

于 2012-11-10T00:35:38.687 回答
1

如果我正确理解您的问题,您可以将file.*服务移动到一个文件并将使用的服务移动file.adapter到另一个文件并创建file.adapter别名,同时在加载文件之间创建别名。例如

$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/services'));
$loader->load('fileadapter.xml'); 

$defaultAdapterId = "file." . $container->getParameter('file.adapterType');
if($container->hasDefinition($defaultAdapterId)) {
    $container->setAlias('file.adapter', $defaultAdapterId);
}

$loader->load('other_services.xml'); 
于 2012-11-10T09:32:14.140 回答
0

现在(实际上是从 2.7 版开始),你可以使用 symfony 表达式语言来做同样的事情,只需要配置

看看这里http://symfony.com/doc/current/service_container/expression_language.html

于 2017-04-06T14:20:48.113 回答