Twig 如何向自定义细枝添加变量';令牌解析器?

Twig 如何向自定义细枝添加变量';令牌解析器?,twig,Twig,我想制作自定义的细枝标记,类似于include标记,但从json文件中获取变量。也就是说,在twig模板中,我写{%section“header”%},它包括头文件,并将config.json文件中的变量仅附加到此模板。如何做到这一点 在写这个问题之前,我读了几遍,但没有找到任何具体的解决方案如何解决我的问题好的,我已经创建了一个小模型,应该可以帮助您在这条道路上走得更远 MyNode.php 小枝 {%mynode%} {{injected_variable.glossary.title}{

我想制作自定义的细枝标记,类似于include标记,但从json文件中获取变量。也就是说,在twig模板中,我写{%section“header”%},它包括头文件,并将config.json文件中的变量仅附加到此模板。如何做到这一点


在写这个问题之前,我读了几遍,但没有找到任何具体的解决方案如何解决我的问题

好的,我已经创建了一个小模型,应该可以帮助您在这条道路上走得更远

MyNode.php

小枝


{%mynode%}
{{injected_variable.glossary.title}{{{#打印示例词汇表}
{%endmynode%}

可能重复“否”,这不是启动节点的好教程。要向节点传递参数,我建议您查看节点,
$name=$stream->expect(Twig_Token::name_TYPE)->getValue()我同意这是一个很棒的教程。这对于创建自定义标记非常有帮助。我遇到的问题是,找不到向解析器添加变量的方法。不是从模板(比如{%include with{'foo':'bar'}%}),而是在解析或编译节点时从其他源插入,您希望能够在定义的节点内使用外部变量吗?非常感谢!
<?php
    namespace Namespace\Base\Twig\Node;

    class MyNode extends \Twig_Node {
        private static $nodeCount = 1;
        /**
         * @param \Twig_Node_Expression $annotation
         * @param \Twig_Node_Expression $keyInfo
         * @param \Twig_NodeInterface   $body
         * @param integer               $lineno
         * @param string                $tag
         */
        public function __construct(\Twig_NodeInterface $body, $lineno, $tag = null) {
            parent::__construct(['body' => $body,], array(), $lineno, $tag);
        }

        public function compile(\Twig_Compiler $compiler) {
            $i = self::$nodeCount ++;

            $json_data = json_decode(file_get_contents(__DIR__ . '/../../../../files/tmp/file.json'), true);
            $compiler
                ->addDebugInfo($this)
                ->write('$context[\'injected_variable\'] = '.var_export($json_data, true).';') //add data to context
                ->subcompile($this->getNode('body')) //compile everything in between the node
                ->write('unset($context[\'injected_variable\']);'); //clean context afterwards
        }
    }
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}
<!DOCTYPE html>
<html>
    <head></head>
    <body>
        {% mynode%}
            {{ injected_variable.glossary.title }} {# prints example glossary  #}
        {% endmynode %}
    </body>
</html>