有没有可能用PHP检索Twig模板中的所有变量?
示例someTemplate.twig.php:
Hello {{ name }},
your new email is {{ email }}
现在我想做这样的事情:
$template = $twig->loadTemplate('someTemplate');
$variables = $template->getVariables();
$variables现在应该包含"name“和"email”。
我想这样做的原因是,我在一个CMS系统上工作,其中我的小枝模板和变量是由我的用户动态设置的,他们也通过API填充变量。
我希望将默认值设置为未设置的变量,因此我需要模板…中存在的所有变量的列表
发布于 2015-10-22 16:39:39
我发现这对获取当前上下文中所有可用的顶级键很有用:
<ol>
{% for key, value in _context %}
<li>{{ key }}</li>
{% endfor %}
</ol>
发布于 2017-05-25 21:59:59
我这样做的方式是
<script>console.log({{ _context | json_encode | raw }});</script>
然后我就用DevTools检查我的控制台
发布于 2016-10-18 17:54:36
我认为19Gerhard85的答案非常好,尽管它可能需要一些调整,因为它为我匹配了一些空字符串。我喜欢在可能的情况下使用现有函数,这是一种主要使用twig函数的方法。您需要访问应用程序的twig环境。
/**
* @param $twigTemplateName
* @return array
*/
public function getRequiredKeys($twigTemplateName)
{
$twig = $this->twig;
$source = $twig->getLoader()->getSource($twigTemplateName);
$tokens = $twig->tokenize($source);
$parsed = $twig->getParser()->parse($tokens);
$collected = [];
$this->collectNodes($parsed, $collected);
return array_keys($collected);
}
它唯一的定制部分是递归函数,它只收集特定类型的节点:
/**
* @param \Twig_Node[] $nodes
* @param array $collected
*/
private function collectNodes($nodes, array &$collected)
{
foreach ($nodes as $node) {
$childNodes = $node->getIterator()->getArrayCopy();
if (!empty($childNodes)) {
$this->collectNodes($childNodes, $collected); // recursion
} elseif ($node instanceof \Twig_Node_Expression_Name) {
$name = $node->getAttribute('name');
$collected[$name] = $node; // ensure unique values
}
}
}
https://stackoverflow.com/questions/12799094
复制相似问题