在symfony2的参数中的动态服务ID? [英] Dynamic service id in an argument in symfony2?

查看:47
本文介绍了在symfony2的参数中的动态服务ID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆