我想让我的包从它的配置中注入一个全局分支。
class MyBundle extends AbstractBundle
{
public function build(ContainerBuilder $container): void
{
parent::build($container);
$container->addCompilerPass(new TwigPass());
}
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
$theme = $config['theme']; // how to make this a twig global?
// $twig = $builder->getDefinition('twig'); // NOPE! Twig isn't loaded yet.
}
编译器传递得到twig,当我的包扩展加载时,它不可用。
class TwigPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
if (false === $container->hasDefinition('twig')) {
return;
}
$theme = 'theme_from_config';
$def = $container->getDefinition('twig');
$def->addMethodCall('addGlobal', ['theme', $theme]);
我遗漏了一些东西,或者有些东西出了问题。编译器如何从扩展中获取配置数据?或者如果这不是正确的方法,我如何从我的bundle配置中注入一个twig全局变量?
1条答案
按热度按时间svgewumm1#
使配置数据可用于传递的方法是将数据作为参数添加到容器中:
要真正将主题配置值放入$config数组中,需要创建一个Configure类。幸运的是,AbstractBundle可以通过configure方法简化这一过程:
在使其工作后,有一个额外的DI类(即TwigPass)有点烦人,所以我从内核中偷了一个技巧,让AbstractBundle实现了pass接口:
如果你遵循这种方法,那么你实际上可以将你的主题保存为包类中的一个属性,而不需要添加一个公共参数。