4

在我的应用程序中,我有一个 SMS 服务。该服务是一个简单的 POPO,它为驱动程序提供一个实例来执行实际的 SMS 功能。

想象一下,我有两个驱动程序,mock_driver它们gateway_driver在本services节中被定义为如下所示:

mock_driver:
    class: MyApp\Service\Sms\MockDriver

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

SMS服务定义如下:

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

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

service_sms_driver: ["@mock_driver"]

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

任何帮助表示赞赏。

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

4

1 回答 1

14

由于您的服务构造不同,因此别名的想法似乎是一个正确的想法。
为此,只需创建您的两个驱动程序服务和您的管理器。(注意用法@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

结果是

[container] 服务驱动信息
该服务是服务 mock_driver 的别名


config_prod.yml

parameters:
    service_sms_driver: gateway_driver

跑步

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

结果是

[container] 服务驱动信息
该服务是服务 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”不存在。

于 2013-10-14T08:33:24.473 回答