symfony2中参数中的动态服务ID?

use*_*848 9 config symfony

是否可以在Symfony 2(xml configs)中动态设置参数中的服务ID(例如,可以通过参数设置的类名)?

以下不起作用

<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" />
Run Code Online (Sandbox Code Playgroud)

这个想法是设置PARAM%dynamic_service_name%动态地通过$容器 - >的setParameter"服务1"或"服务2",所以所需要的实例/对象被传递为了MyService级,例如,在扩展::负载()(" dynamic_service_name", '服务1');

非常感谢

Fur*_*gas 16

您可以使用CompilerPass:

class DynamicServiceCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $container->getDefinition('myservice')
            ->setArguments(array(new Reference($container->getParameter('dynamic_service_name'))));
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到您的Bundle类:

public function build(ContainerBuilder $container)
{
    parent::build($container);

    $container->addCompilerPass(new DynamicServiceCompilerPass());
}
Run Code Online (Sandbox Code Playgroud)

跟进:

从Symfony 2.4开始,您可以像这样使用表达式语言:

<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>
Run Code Online (Sandbox Code Playgroud)


See*_*eer 1

直接来自 symfony2 文档;)

<!-- app/config/config.xml -->
<parameters>
    <parameter key="my_mailer.class">Acme\HelloBundle\Mailer</parameter>
    <parameter key="my_mailer.transport">sendmail</parameter>
</parameters>

<services>
    <service id="my_mailer" class="%my_mailer.class%">
        <argument>%my_mailer.transport%</argument>
    </service>
</services>
Run Code Online (Sandbox Code Playgroud)

这就是你所追求的吗?

http://symfony.com/doc/current/book/service_container.html#service-parameters

编辑:

这是我的服务之一,使用参数。然而,它是在 YAML 中。这很好用。正如您所看到的,它在参数中使用类名称和类的名称空间。

parameters:
    seer_ukd_wright_gallery.gallery_helper.class: SeerUK\DWright\GalleryBundle\DependencyInjection\GalleryHelper

services:
    seer_ukd_wright_gallery.gallery_helper:
        class: %seer_ukd_wright_gallery.gallery_helper.class%
        arguments:
            em: "@doctrine.orm.entity_manager"
Run Code Online (Sandbox Code Playgroud)