Symfony 使用服务别名进行依赖项注入

Symfony 使用服务别名进行依赖项注入,symfony,dependency-injection,Symfony,Dependency Injection,在我的应用程序中,我有一个短信服务。此服务是一个简单的POPO,它将一个实例带到驱动程序以执行实际的SMS功能 假设我有两个驱动程序,mock\u-driver和gateway\u-driver,它们在服务部分定义如下: mock_driver: class: MyApp\Service\Sms\MockDriver gateway_driver: class: MyApp\Service\Sms\GatewayDriver calls: - [setC

在我的应用程序中,我有一个短信服务。此服务是一个简单的POPO,它将一个实例带到驱动程序以执行实际的SMS功能

假设我有两个驱动程序,
mock\u-driver
gateway\u-driver
,它们在
服务
部分定义如下:

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
方法中。这是哪个驱动程序应该在my
parameters.yml
中定义,例如:

service_sms_driver: ["@mock_driver"]
但是,我一直坚持正确使用语法。除了我的
parameters.yml
service\u sms\u driver
值的语法和实际服务的
setDriver
方法调用之外,我认为它的要点是正确的

谢谢你的帮助

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

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

services.yml

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

Acme/FooBundle/DependencyInjection/acmefootextension.php

这将采用
服务\u sms\u驱动程序
参数并创建此服务的别名


调试示例:

config_dev.yml

运行

$ php app/console --env=dev container:debug driver
$ php app/console --env=prod container:debug driver
$ php app/console --env=test container:debug driver
导致

服务驱动程序的[容器]信息
此服务是服务模拟驱动程序的别名


config_prod.yml

运行

$ php app/console --env=dev container:debug driver
$ php app/console --env=prod container:debug driver
$ php app/console --env=test container:debug driver
导致

服务驱动程序的[容器]信息
此服务是服务网关驱动程序的别名


配置测试.yml

运行

$ php app/console --env=dev container:debug driver
$ php app/console --env=prod container:debug driver
$ php app/console --env=test container:debug driver
导致

[Symfony\Component\DependencyInjection\Exception\InvalidArgumentException]
服务定义“未知驱动程序”不存在


工作起来很有魅力。谢谢