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)));