You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Bundle配置中添加Twig全局变量?

从Bundle配置注入Twig全局变量的解决方法

核心问题是Bundle扩展加载时Twig服务定义还未就绪,所以需要通过容器参数中转配置数据,再在编译器Pass中完成Twig全局变量的注入,步骤如下:

1. 在Bundle扩展中保存配置到容器参数

修改loadExtension方法,把配置里的theme值存入容器参数,后续编译器Pass就能直接读取:

public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{ 
    // 将配置的theme值存入全局容器参数
    $builder->setParameter('my_bundle.theme', $config['theme']);
}

2. 修改Twig编译器Pass获取配置并注入全局变量

在TwigPass的process方法中,从容器参数取出之前保存的theme值,再调用Twig的addGlobal方法:

class TwigPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        // 先检查Twig服务是否存在
        if (!$container->hasDefinition('twig')) {
            return;
        }
        
        // 从容器参数中读取配置的theme值
        $theme = $container->getParameter('my_bundle.theme');
        $twigDef = $container->getDefinition('twig');
        // 注入Twig全局变量
        $twigDef->addMethodCall('addGlobal', ['theme', $theme]);
    }
}

补充:确保Bundle配置字段已定义

如果还没配置theme字段的校验规则,需要在Configuration类中添加:

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder(): TreeBuilder
    {
        $treeBuilder = new TreeBuilder('my_bundle');
        $rootNode = $treeBuilder->getRootNode();
        
        $rootNode
            ->children()
                // 定义theme字段,设置默认值为default
                ->scalarNode('theme')->defaultValue('default')->end()
            ->end();
        
        return $treeBuilder;
    }
}

原理说明

容器参数在整个DI容器构建过程中是全局可访问的,而编译器Pass是在所有Bundle扩展加载完成后执行的,这时候Twig的服务定义已经完全初始化,所以能安全获取并修改它的方法调用。

内容的提问来源于stack exchange,提问作者Tac Tacelosky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:20:15