Php 在Symfony 3中向注入服务注册自定义细枝扩展将导致错误

Php 在Symfony 3中向注入服务注册自定义细枝扩展将导致错误,php,twig,symfony,twig-extension,Php,Twig,Symfony,Twig Extension,我使用的是Symfony 3.1.3,我有一个名为“@app.actionmanager”的服务,它希望将自己注入到一个小树枝扩展中,以显示可用的操作(这是“@app.actionmanager”负责的)。事实上,每次我跑步时: $> php bin/console cache:clear 我收到以下错误: [LogicException]无法注册扩展名 “actionmanager\u twig\u扩展”作为扩展已被删除 初始化 延期声明如下: app.twig.actionmanag

我使用的是Symfony 3.1.3,我有一个名为“@app.actionmanager”的服务,它希望将自己注入到一个小树枝扩展中,以显示可用的操作(这是“@app.actionmanager”负责的)。事实上,每次我跑步时:

$> php bin/console cache:clear
我收到以下错误:

[LogicException]无法注册扩展名 “actionmanager\u twig\u扩展”作为扩展已被删除 初始化

延期声明如下:

app.twig.actionmanager:
    class: AppBundle\Twig\ActionManagerExtension
    arguments: ["@app.actionmanager"]
    public: false
    tags:
        - { name: twig.extension }
如果我移除服务的注入,就没有问题了。如果我将这样一个服务的注入更改为另一个服务(例如@service\u容器),我会不断得到相同的错误

在twig扩展中注入服务似乎会停止将其注册到twig,直到rest服务注册完毕

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

你能帮忙吗

对不起,我的英语不好,它不是我的母语


编辑:显示app.actionmanager声明:

app.actionmanager:
   class: AppBundle\Services\ActionManager

更新:Cerad是对的@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)));
        }
    }
}

问题在于编译器过程是在调用之后调用的

此时Symfony用于命令编译器通过

并且定义了细枝编译器过程(使用默认的PassConfig::TYPE\u BEFORE\u OPTIMIZATION=first)

所以你现在不能改变订单



但是在Symfony3.2(2016年11月发行版)中,您可以为编译器过程设置优先级,添加了:

您可以显示@app.actionmanager的声明吗?您是否尝试过删除
public:false
?是。我尝试删除public:false,但仍然不工作您正在使用标准方法加载服务?没有编译器通过之类的吗?看起来你发布的东西应该有用。我正在使用一个编译器过程,当我删除它时,所有东西都会工作。我用编译器的信息和代码更新我的问题。不管怎样,编译器是否已经使用了该服务,并使细枝扩展正常工作?至少现在我知道出了什么问题。我会等到十一月。谢谢阿尔萨斯人。如果你不想进入prod,你可以试试3。2@dev ;)