Parsing 如何解析细枝自定义标记参数
我编写了一个自定义的Twig TagTokenParser,以便在模板中编写: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 (
{% 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}”
进行字符串插值。