gpt4 book ai didi

symfony - 如何从捆绑配置中添加全局 Twig ?

转载 作者:行者123 更新时间:2023-12-05 04:23:00 25 4
gpt4 key购买 nike

我希望我的包从其配置中注入(inject)全局 Twig 。

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]);

我遗漏了什么,或者什么东西出了问题。编译器如何通过从扩展中获取配置数据?或者,如果这不是正确的方法,我如何从我的包配置中注入(inject)全局 Twig ?

最佳答案

使配置数据可用于传递的方法是将数据作为参数添加到容器中:

class TwigPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
if (false === $container->hasDefinition('twig')) {
return;
}
$theme = $container->getParameter('my.theme');

$def = $container->getDefinition('twig');
$def->addMethodCall('addGlobal', ['theme', $theme]);
}
}
class CeradMyBundle extends AbstractBundle

public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
$container->parameters()->set('my.theme', $config['theme']);
}

要真正将您的主题配置值放入 $config 数组中,需要创建一个 Configure 类。幸运的是,AbstractBundle 可以使用配置方法简化这一过程:

# config/packages/cerad_my.yaml
cerad_my:
theme: theme_from_config_file

class CeradMyBundle extends AbstractBundle

public function configure(DefinitionConfigurator $definition): void
{
$definition->rootNode()
->children()
->scalarNode('theme')->defaultValue('theme_default')->end()
->end()
;
}

让它工作后,有一个额外的 DI 类,即 TwigPass 有点烦人,所以我从内核中偷了一个技巧,让 AbstractBundle 实现了 pass 接口(interface):

class CeradMyBundle extends AbstractBundle implements CompilerPassInterface
{
public function build(ContainerBuilder $container): void
{
// Register as a pass
$container->addCompilerPass($this);
}
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
$container->parameters()
->set('my.theme', $config['theme']);
}
public function configure(DefinitionConfigurator $definition): void
{
$definition->rootNode()
->children()
->scalarNode('theme')->defaultValue('theme_default')->end()
->end()
;
}
// The compiler pass
public function process(ContainerBuilder $container)
{
if (false === $container->hasDefinition('twig')) {
return;
}
$theme = $container->getParameter('my.theme');
$def = $container->getDefinition('twig');
$def->addMethodCall('addGlobal', ['theme', $theme]);
}
}

如果您采用这种方法,那么您实际上可以将您的主题保存为 bundle 类中的一个属性,而无需添加公共(public)参数。您的选择。

关于symfony - 如何从捆绑配置中添加全局 Twig ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73814467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com