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

时间:2014-12-02 23:12:06

标签: parsing twig token

我写了一个自定义的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标记中解析表达式locate并将其写入我的TagNode编译器?

我尝试将表达式解析为一个新字符串,但是当我在编译时松开上下文时:

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

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

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

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您需要解析表达式而不是字符串,因此您的变量(甚至函数调用,字符串,计算或其他)将被解释:

而不是:

// 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'));

请查看this answer以了解有关主题的详细信息。