Php 在细枝模板中解析/搜索特定函数

Php 在细枝模板中解析/搜索特定函数,php,twig,Php,Twig,在的最新版本中,客户函数将作为Twig\u SimpleFunctions实现,因为旧方法已被弃用 我有一个自定义翻译功能,用于使用资源包处理消息格式化程序: {{ trans('key') }} 我正在构建一个PHP脚本来遍历所有模板以检索这些键。我不希望在此脚本中呈现模板,因为我没有传递给模板的所有变量。使用load()(这对性能很重要)加载模板时不会调用函数,因此我需要一个lexer来解析模板 不幸的是,关于这方面的信息并不多,所以很难说从哪里开始 如何添加一个客户lexer来解析函数,

在的最新版本中,客户函数将作为
Twig\u SimpleFunction
s实现,因为旧方法已被弃用

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

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

不幸的是,关于这方面的信息并不多,所以很难说从哪里开始

如何添加一个客户lexer来解析函数,比如
{{trans('key')}


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

解决方案其实很简单。我们需要获取所有模板,加载每个模板,然后在其上运行解析器以生成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)));