如何从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
相关产品推荐
相关产品推荐

