在我的应用程序中,我有一个短信服务。此服务是一个简单的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
方法。应该在我的parameters.yml
中定义哪个驱动程序,例如:
service_sms_driver: ["@mock_driver"]
但是,我坚持使用语法来使其正常工作。我认为它的要点是正确的,除了service_sms_driver
中parameters.yml
值的语法和实际服务上的setDriver
方法调用。
任何帮助表示感谢。
修改 正如澄清一样,两个驱动程序都实现了相同的接口。但是,每个驱动程序可能需要不同的配置方式,这些方式可能无法在接口中捕获。如果我只是传递类名它会工作正常,但我试图注入实例。希望这是有道理的。
答案 0 :(得分:14)
由于您的服务构建方式不同,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
结果
[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的\元器件\ DependencyInjection \异常\ InvalidArgumentException]
服务定义“unknown_driver”不存在。