在树枝模板中解析/搜索某个功能

时间:2014-02-18 01:58:18

标签: php twig

在最新版本的twig中,客户函数将被实现为Twig_SimpleFunction,因为旧方法已被弃用。

我有一个自定义翻译功能,用于处理使用资源包的消息格式化程序:

{{ trans('key') }}

我正在构建一个PHP脚本来遍历我的所有模板以检索这些密钥。我不希望在此脚本中呈现模板,因为我没有将所有变量传递给模板。使用load()加载模板时不会调用函数(这对性能很重要),因此我需要一个词法分析器来解析模板。

不幸的是,关于这方面确实没有太多信息,所以很难分清楚从哪里开始。

如何添加客户词法分析器来解析{{ trans('key') }}等函数?

或者,如果有更好/更简单的方法来实现这一点,我当然希望知道!

1 个答案:

答案 0 :(得分:2)

解决方案非常简单。我们需要获取所有模板,加载每个模板,然后在其上运行解析器以生成AST。然后我们走过AST来挑选我们想要的东西。没有必要编译模板。

以下是如何做到这一点:

public function process($node) 
{
    // Process nodes that are function expressions
    if ($node instanceof \Twig_Node_Expression_Function) {
        // Check the function name
        if ($node->getAttribute('name') == 'trans') {
            // Grab the argument
            foreach ($node->getNode('arguments') as $argument) { 
                $key = eval('return ' . $this->twig->compile($argument) . ';' );

                if (!in_array($key, $translationKeys)) {
                    $this->trans[] = $key;
                }

                // I only needed the first argument in my implementation
                break; 
            }
        }
    }

    // Recursively loop through the AST
    foreach ($node as $child) {
        if ($child instanceof \Twig_Node) {
            process($child);
        }
    }
}

提示:如果要从外部文件而不是字符串加载模板,则需要使用getContent()以文本形式获取模板:

$parsed = $twig->parse($twig->tokenize($loader->getSource($template)));