Parsing 如何解析细枝自定义标记参数

Parsing 如何解析细枝自定义标记参数,parsing,twig,token,Parsing,Twig,Token,我编写了一个自定义的Twig TagTokenParser,以便在模板中编写: {% tag "tagtype" argument1="value1" argument2="value3" %}{% endtag %} 它可以工作,但我想将动态属性值: {% tag "tagtype" argument1="{{ myVar.myProp }}" argument2="value3" %}{% endtag %} 以下是我如何编写TagTokenParser: while (

我编写了一个自定义的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\u Token::STRING\u TYPE Token中的表达式并将其写入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 %}
警告:在
令牌解析器
中,
$value
变量将不包含变量的值,而是一个可编译表达式,它将在运行时从上下文中检索变量的值

因此,在
节点
中,您需要对其进行子编译,而不是使用
$value

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

请查看主题的详细信息。

谢谢!我现在理解了将参数值解析为表达式,然后在我的
节点中对其进行子编译的需要。但是,有可能以“…”模式解析表达式吗?例如:
“{{myVar.myProp}}”
?使用类似于
$stream->skipToken(“”);$value=$parser->getExpressionParser()->parseExpression();$stream->skipToken(““”)?可以使用
“#{myVar.myProp}”
进行字符串插值。