我正在写一个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(是错误吗?)
提前致谢
答案 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
没有引号。