在symfony2的参数中的动态服务ID? [英] Dynamic service id in an argument in symfony2?
问题描述
在Symfony 2(XML配置)中是否可以在参数中动态设置服务ID(例如,可以通过参数设置的类名)?
Is it possible to set the service id in an argument dynamically (e.g. like a class name which could be set via parameter) in Symfony 2 (xml configs)?
以下内容无效
<service id="myservice" class="myservice.php">
<argument type="service" id="%dynamic_service_name%" />
</service>
<service id="service1" class="foobar\service1" />
<service id="service2" class="foobar\service1" />
想法是将参数%dynamic_service_name%动态设置为 service1或 service2,因此所需的实例/对象传递给myservice-class,例如在扩展:: load()中通过$ container-> setParameter('dynamic_service_name','service1');
the idea is to set the param %dynamic_service_name% dynamically to "service1" or "service2", so the needed instance/object is passed to myservice-class, e.g. in the Extension::load() via $container->setParameter('dynamic_service_name','service1');
非常感谢
推荐答案
您可以使用CompilerPass:
You can use CompilerPass:
class DynamicServiceCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->getDefinition('myservice')
->setArguments(array(new Reference($container->getParameter('dynamic_service_name'))));
}
}
并将其添加到Bundle类中:
and add it to your Bundle class:
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new DynamicServiceCompilerPass());
}
跟进:
从Symfony 2.4开始,您可以使用表达语言像这样:
Since Symfony 2.4 you can use Expression Language like this:
<services>
<service id="myservice" class="My\Service">
<argument type="expression">service(container.hasParameter('dynamic_service_name') ? parameter('dynamic_service_name') : 'default_service_name')</argument>
</service>
</services>
这篇关于在symfony2的参数中的动态服务ID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!