【问题标题】:How to parse Twig custom tag arguments如何解析 Twig 自定义标签参数
【发布时间】:2014-12-02 23:12:06
【问题描述】:

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

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

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

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: parsing twig token


    【解决方案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

    【讨论】:

    • 谢谢!我现在明白需要将参数值解析为表达式,然后在我的Node 中对其进行子编译。但是,是否可以以“...”模式解析表达式?例如:"{{ myVar.myProp }}"?使用 $stream->skipToken('"'); $value = $parser->getExpressionParser()->parseExpression();$stream->skipToken('"'); 之类的东西?
    • 您可以使用"#{myVar.myProp}"进行字符串插值。
    猜你喜欢
    • 2017-05-18
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多