如何解析 Twig 自定义标记参数



我写了一个自定义的Twig TagTokenParser让我在我的模板中写这个:

{% tag "tagtype" argument1="value1" argument2="value3" %}{% endtag %}

它有效,但我想输入动态属性值:

{% tag "tagtype" argument1="{{ myVar.myProp }}" argument2="value3" %}{% endtag %}

以下是我如何编写我的TagTokenParser:

        while (!$stream->test(Twig_Token::BLOCK_END_TYPE)) {
        if ($stream->test(Twig_Token::NAME_TYPE)) {
            // Read the attribute name
            $name = $stream->next()->getValue();
            // Read the "="
            $stream->expect(Twig_Token::OPERATOR_TYPE, '=');
            // Read the attribute value
            $token = $stream->expect(Twig_Token::STRING_TYPE);
            $value = $token->getValue();

如何解析位于 \Twig_Token::STRING_TYPE 令牌中的表达式并将其写入我的 TagNode 编译器?

我尝试将表达式解析为新字符串,但是当我在编译它时丢失上下文时:

 $parameters = $this->parser->getEnvironment()->tokenize($attribute_value);

或者有没有办法将参数值解析为表达式? 像这样:

$value = $parser->getExpressionParser()->parseExpression();

非常感谢您的帮助!

你需要解析一个表达式而不是一个字符串,所以你的变量(甚至是函数调用、字符串、计算或其他什么)将被解释:

而不是:

// Read the attribute value
$token = $stream->expect(Twig_Token::STRING_TYPE);
$value = $token->getValue();

您应该使用:

$value = $parser->getExpressionParser()->parseExpression();

然后,您将能够使用:

{% tag "tagtype" argument1=myVar.myProp argument2="value3" %}{% endtag %}

警告:在TokenParser中,$value变量将不包含变量的值,而是一个可编译的表达式,该表达式将在运行时从上下文中检索变量的值。

所以,在你的Node中,而不是使用 $value ,你需要对它进行子编译:

$compiler->subcompile($this->getNode('value'));

请查看此答案以获取有关该主题的详细信息。

最新更新