我正在使用 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)));
}
}
}