Symfony 使用服务别名进行依赖项注入
在我的应用程序中,我有一个短信服务。此服务是一个简单的POPO,它将一个实例带到驱动程序以执行实际的SMS功能 假设我有两个驱动程序,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
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
方法中。这是哪个驱动程序应该在myparameters.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]服务定义“未知驱动程序”不存在
工作起来很有魅力。谢谢