Symfony-使用其他捆绑软件中的服务

loo*_*ers 6 php symfony symfony-3.4

我试图使用另一个捆绑软件中的服务,而没有在捆绑软件之间创建任何依赖关系。我正在尝试使用,CompilerPass但这可能不是最好的方法。

ParamConverter在BarBundle中创建了一个FooBundle应该用于它的Controllers。

但是我得到了错误: No converter named foo_bundle.converter_service found for conversion of parameter fooObject

到目前为止,我有:

app / config / config.yml

foo_bundle:
    converter_service: bar_bundle.converter.object
Run Code Online (Sandbox Code Playgroud)

src / BarBundle / config / service.yml

services:
    bar_bundle.converter.object:
        class: BarBundle\ParamConverter\ObjectParamConverter
        tags:
            - { name: request.param_converter, priority: 0, converter: bar_bundle.converter.object }
Run Code Online (Sandbox Code Playgroud)

src / FooBundle / DependencyInjection / FooBundleExtension.php

public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');

    $container->setParameter('foo_bundle.converter_service.id', $config['converter_service']);
}
Run Code Online (Sandbox Code Playgroud)

src / FooBundle / FooBundle.php

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

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

src / FooBundle / DependencyInjection / CompilerPass.php

public function process(ContainerBuilder $container)
{
    $convertserService = $container->getDefinition($container->getParameter('foo_bundle.converter_service.id'));
    $container->setDefinition('foo_bundle.converter_service', $convertserService);
}
Run Code Online (Sandbox Code Playgroud)

控制器注释:

/**
 * Show Feed document.
 *
 * @Route("/{id}/add", name="object_add")
 * @ParamConverter("fooObject", converter="foo_bundle.converter_service")
 */
public function addAction(ObjectInterface $fooObject)
Run Code Online (Sandbox Code Playgroud)

如果我$container->get('foo_bundle.converter_service')在CompilerPass中调用,我可以看到该对象已正确设置。

是优先事项吗?即CompilerPass解析注释后的运行。还是这只是错误的方法?

j-g*_*yon 1

@ParamConverter与加载 a 一样,CompilerPass您可能必须首先强制执行您的加载。

请注意,默认编译器传递优先级为 0,优先级越高,执行越早。

尝试这个 :

public function build(ContainerBuilder $container)
{
    parent::build($container);
    $container->addCompilerPass(new CompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 30);
}
Run Code Online (Sandbox Code Playgroud)