gpt4 book ai didi

symfony - 选择众多服务之一作为要使用的服务

转载 作者:行者123 更新时间:2023-12-02 06:57:58 26 4
gpt4 key购买 nike

场景:

  • 我将依赖注入(inject)组件用作独立组件。没有 bundle /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-方法接收参数和di-container并返回对应的service:

    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

其他替代方案?

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

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

最佳答案

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

关于symfony - 选择众多服务之一作为要使用的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com