Twig,parser,仅限字符串(禁止表达式)

时间:2013-06-19 12:29:15

标签: symfony twig

我正在写一个twig标签,我想告诉Tokenizer标签第一个Argument是一个常量而不是表达式。

例如,假设我的标签是“echo”的别名:

{% tagname 'toto' %}

应该产生“toto”(没有引号)

{% tagname toto %}

还应该产生“toto”(没有引号)

{% tagname toto.xx %}

应该产生“toto.xx”(没有引号)

问题出在最后一个例子中,令牌解析器将“toto”视为表达式,因此查找名为“toto”的变量。

所以我想知道是否有可能以某种方式指定tag参数必须是常量?

我的代码现在看起来如何:

public function parse(\Twig_Token $token)
{
    $parser = $this->parser;
    $stream = $parser->getStream();
    $text = $parser->getExpressionParser()->parseStringExpression();

我也试过了ExpressionParser中的parsePrimaryExpression,parseHashExpression(是错误吗?)

提前致谢

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您想同时使用{% sometag 'foo' %}{% sometag foo %}吗?

这是在词法分析器SometagTokenParser中完成的。带引号的那个名为Twig_Token::STRING_TYPE,没有引号的名称为Twig_Token::NAME_TYPE。在您的令牌解析器中使用类似的东西:

if ($stream->test(\Twig_Token::NAME_TYPE)) {  
    $name = $stream->expect(\Twig_Token::NAME_TYPE)->getValue();  
} else {  
    $name = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();  
}  

两者都只是在应用程序的其余部分中作为字符串处理。

在Twig中无法支持tuto.foo没有引号。