在最新版本的twig中,客户函数将被实现为Twig_SimpleFunction
,因为旧方法已被弃用。
我有一个自定义翻译功能,用于处理使用资源包的消息格式化程序:
{{ trans('key') }}
我正在构建一个PHP脚本来遍历我的所有模板以检索这些密钥。我不希望在此脚本中呈现模板,因为我没有将所有变量传递给模板。使用load()
加载模板时不会调用函数(这对性能很重要),因此我需要一个词法分析器来解析模板。
不幸的是,关于这方面确实没有太多信息,所以很难分清楚从哪里开始。
如何添加客户词法分析器来解析{{ trans('key') }}
等函数?
或者,如果有更好/更简单的方法来实现这一点,我当然希望知道!
答案 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)));