【发布时间】:2014-03-13 00:57:10
【问题描述】:
我有一项服务,需要司机来完成实际工作。驱动程序本身在 Symfony 2 的上下文中只是另一个服务。
为了说明一个简化的版本:
services:
# The driver services.
my_scope.mailer_driver_smtp:
class: \My\Scope\Service\Driver\SmtpDriver
my_scope.mailer_driver_mock:
class: \My\Scope\Service\Driver\MockDriver
# The actual service.
my_scope.mailer:
class: \My\Scope\Service\Mailer
calls:
- [setDriver, [@my_scope.mailer_driver_smtp]]
如上所示,我可以将两个驱动程序服务中的任何一个注入到 Mailer 服务中。问题当然是被注入的驱动服务是硬编码的。所以,我想参数化@my_scope.mailer_driver_smtp。
我通过向我的parameters.yml添加一个条目来做到这一点
my_scope_mailer_driver: my_scope.mailer_driver_smtp
然后我可以在我的config.yml 中使用它并将参数分配给语义公开的配置 [1]:
my_scope:
mailer:
driver: %my_scope_mailer_driver%
最后,在我的包的Configuration 类中,我在容器上设置了一个参数:
$container->setParameter('my_scope.mailer.driver', $config['mailer']['driver'] );
容器参数my_scope.mailer.driver的值现在等于我在parameters.yml中设置的my_scope.mailer_driver_smtp,也就是说,按照我的理解是正确的,只是一个字符串。
如果我现在使用容器中的参数名称,我会收到一个错误,抱怨没有这样的服务。例如:
services:
my_scope.mailer:
class: \My\Scope\Service\Mailer
calls:
- [setDriver, [@my_scope.mailer.driver]]
以上会报错:
[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]
The service "my_scope.mailer" has a dependency on a non-existent service "my_scope.mailer.driver"
现在的问题是,注入这个基于容器参数的服务的正确语法是什么?
[1]http://symfony.com/doc/current/cookbook/bundles/extension.html
【问题讨论】:
-
有趣。您指向我之前提出的问题的公认答案。您认为您可以在答案中添加上面的链接,以便我可以接受它作为正确答案吗?谢谢。
标签: symfony configuration dependency-injection