Symfony2将变量从自己的bundle传递给twig

时间:2016-03-15 00:00:09

标签: php symfony twig

我正在开发第三方软件包。

我需要定义一个可以在此包的twig模板中使用的变量。

当我尝试在我的bundle config.yml模式中声明变量在我的项目上执行twig模板时,

twig:
    globals:
        test_vars: %test_vars%

我收到此错误。

InvalidArgumentException in YamlFileLoader.php line 357:
There is no extension able to load the configuration for "twig" (in /home/domain.ext/vendor/test/test-bundle/test/TestBundle/DependencyInjection/../Resources/config/.yml). Looked for namespace "twig", found none

非常感谢

解决方案代码,感谢@ alexander.polomodov和@mblaettermann

GlobalsExtension.php

namespace Vendor\MyBundle\Twig\Extension;

class GlobalsExtension extends \Twig_Extension {

    public function __construct($parameter) {
        $this->parameter= $parameter;
        //...
    }

    public function getGlobals() {

        return array(
            'parameter' => $this->parameter
            //...
        );
    }

    public function getName() {
        return 'MyBundle:GlobalsExtension';
    }
}

my.yml

services:
    twig.extension.globals_extension:
        class: Vendor\MyBundle\Twig\Extension\GlobalsExtension
        arguments: [%my.var%]
        tags:
            - { name: twig.extension }

my.html.twig

my parameter: {{ parameter }}

2 个答案:

答案 0 :(得分:2)

你应该使用依赖注入在你自己的bundle中完全实现这个逻辑。这意味着,不要劫持twig:配置密钥,而是使用您自己的捆绑配置密钥。

在Bundles Container Extension中,您可以将配置值传递给容器参数,然后将这些参数作为构造函数参数传递给Twig Extension。

然而,在Alex已经指出将Twig Extension添加到容器之前,您需要检查Twig Bundle是否已加载并且可用。

http://symfony.com/doc/current/cookbook/templating/twig_extension.html

答案 1 :(得分:0)

我有相同的情况(将自己的bundle config值传递到树枝模板),我的实际工作解决方案是在我的bundle扩展名中将config值作为全局树枝传递:

1-捆绑软件的扩展名应该扩展PrependExtensionInterface,请参见https://symfony.com/doc/current/bundles/prepend_extension.html

2-您可以执行prepend方法:

    public function prepend(ContainerBuilder $container)
    {
// get configuration from config files
        $configs     = $container->getExtensionConfig($this->getAlias());
        $config      = $this->processConfiguration(new Configuration(), $configs);

// put your config value in an array to be passed in twig bundle
        $twigGlobals = [
            'globals' => [
                'my_global_twig_variable_name' => $config['myConfigKey'],
            ],
        ];
// pass the array to twig bundle
        $container->prependExtensionConfig('twig', $twigGlobals);
    }

然后,您可以在树枝中使用my_global_twig_variable_name。