【问题标题】:Using service aliases for dependency injection使用服务别名进行依赖注入
【发布时间】:2013-10-14 01:52:21
【问题描述】:

在我的应用程序中,我有一个 SMS 服务。该服务是一个简单的 POPO,它将一个实例传递给驱动程序以执行实际的 SMS 功能。

假设我有两个驱动程序,mock_drivergateway_driver,它们在 services 部分中定义为类似这样的内容:

mock_driver:
    class: MyApp\Service\Sms\MockDriver

gateway_driver:
    class: MyApp\Service\Sms\GatewayDriver
    calls:
        - [setConfig, ["%gateway_user%", "%gateway_password%", "%gateway_endpoint%"]]

短信服务是这样定义的:

service_sms:
    class: MyApp\Service\SmsService
    calls:
        - [setDriver, ["%service_sms_driver%"]] 

我面临的问题是我想将两个驱动程序之一的“实例”传递给我的服务的setDriver 方法。这是哪个驱动程序应该在我的parameters.yml 中定义,例如:

service_sms_driver: ["@mock_driver"]

但是,我坚持使用语法以使其正常工作。我认为它的要点是正确的,除了我的parameters.ymlservice_sms_driver 值的语法和实际服务上的setDriver 方法调用。

任何帮助表示赞赏。

编辑: 澄清一下,两个驱动程序都实现了相同的接口。但是,每个驱动程序可能需要不同的配置方式,这些配置方式可能不会在接口中捕获。如果我只是简单地传递类名,它会工作得很好,但我正在尝试注入实例。希望这是有道理的。

【问题讨论】:

    标签: symfony dependency-injection


    【解决方案1】:

    由于您的服务构造不同,aliasing 的想法似乎是一个正确的想法。
    为此,只需创建您的两个驱动程序服务和您的管理器。 (注意@driver的用法

    services.yml

    gateway_driver:
        class: Acme\FooBundle\GatewayDriver
    mock_driver:
        class: Acme\FooBundle\MockDriver
    
    manager:
        class: Acme\FooBundle\SmsManager
        arguments: [ @driver ]
    

    然后,您可以将此别名编辑到您的 AcmeFooExtension 文件中

    Acme/FooBundle/DependencyInjection/AcmeFooExtension.php

    public function load(array $configs, ContainerBuilder $container)
    {
        $driver = $container->getParameter('service_sms_driver');
        $container->setAlias('driver', $driver);
    }
    

    这将采用service_sms_driver 参数并创建此服务的别名。


    调试示例:

    config_dev.yml

    parameters:
        service_sms_driver: mock_driver
    

    跑步

    $ php app/console --env=dev container:debug driver
    

    结果

    [容器] 服务驱动程序信息
    该服务是服务 mock_driver 的别名


    config_prod.yml

    parameters:
        service_sms_driver: gateway_driver
    

    跑步

    $ php app/console --env=prod container:debug driver
    

    结果

    [容器] 服务驱动程序信息
    该服务是服务 gateway_driver 的别名


    config_test.yml

    parameters:
        service_sms_driver: unknown_driver
    

    跑步

    $ php app/console --env=test container:debug driver
    

    结果

    [Symfony\Component\DependencyInjection\Exception\InvalidArgumentException]
    服务定义“unknown_driver”不存在。

    【讨论】:

    • 像魅力一样工作。谢谢!
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2015-09-26
    • 2014-01-19
    • 2014-03-25
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多