2

我正在使用 Symfony 3.1.3,并且我有一个名为“@app.actionmanager”的服务,它希望将自己注入到 Twig 扩展中以显示可用的操作(这是“@app.actionmanager”的职责)。事实是,每次我运行时:

$> php bin/console cache:clear

我收到以下错误:

[LogicException] 无法注册扩展“actionmanager_twig_extension”,因为扩展已被初始化。

扩展声明如下:

app.twig.actionmanager:
    class: AppBundle\Twig\ActionManagerExtension
    arguments: ["@app.actionmanager"]
    public: false
    tags:
        - { name: twig.extension }

如果我删除服务的注入就没有问题。如果我将此类服务的注入更改为另一个(例如@service_container),我会不断收到相同的错误。

似乎在树枝扩展中注入服务会停止将其注册到树枝中,直到其余服务已注册。

我搜索了互联网,没有其他人有这个问题,所以我想我一定做错了什么,只是我不知道是哪个。

你能帮我吗?

PS对不起我的英语不好,这不是我的母语。


编辑:显示 app.actionmanager 声明:

app.actionmanager:
   class: AppBundle\Services\ActionManager

更新:塞拉德是对的。@app.actionmanager 由编译器传递使用。编译器通行证导致此问题。我删除它,一切正常。

我需要编译器传递来构建 app.actionmanager,所以现在我的解决方法是删除 twig 扩展并直接访问 app.actionmanager,将它作为 twig 中的全局变量重新注册。

¿ 有没有其他方法可以做到这一点?

编译器传递文件:

<?php 

namespace AppBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Reference;

class ActionContainerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        // always first check if the primary service is defined
        if (!$container->has('app.actionmanager')) {
            return;
        }

        $manager = $container->findDefinition('app.actionmanager');

        // find all service IDs with the app.actioncontainer tag
        $taggedServices = $container->findTaggedServiceIds('app.actioncontainer');

        foreach ($taggedServices as $id => $tags) {
            // add the service
            $manager->addMethodCall('addActions', array(new Reference($id)));
        }
    }
}
4

1 回答 1

0

问题是您的 Compiler Pass 是在Twig Extension Compiler Pass之后调用的。

此时 Symfony 使用这种机制来订购 Compiler Pass。

twig编译器通道是这样定义的(首先使用默认的PassConfig::TYPE_BEFORE_OPTIMIZATION =)。

因此,您目前无法更改订单。


但是在 Symfony 3.2(2016 年 11 月版本)中,您将能够为编译器通道设置优先级,它是作为新功能添加的:

于 2016-08-10T12:54:39.830 回答