将树枝代码传递到树枝模板并呈现它

Passing twig code into a twig template and rendering it

所以我有一个基本为空的 Twig 模板,应用程序生成一些 Twig 代码并将其作为变量传递到 Twig 模板中,如下所示:

return $this->render('blank.html.twig', [
    'twig' => $this->generateTwig()
]);

blank.html.twig 看起来像这样:

{{ twig }}

但是当渲染模板时,它内部只有未渲染的 twig 代码,如下所示:

{% extends 'base.html.twig' %} {% block content %} <h1>{{ 'app-name'|trans }}...

如何渲染本例中注入的 twig 代码?

file_put_contents('blank', $this->generateTwig()) 可行,但这违背了使用模板的目的。

您可以通过两种方式解决。您可以预渲染 $this->generateTwig() 的输出并将(HTML)注入 blank.html.twig 模板(未经测试的伪):

$template = $this->get('twig')->createTemplate($this->generateTwig());
$twig = $template->render();

return $this->render('blank.html.twig', [
    'twig' => $twig,
]);

这种方法的缺点是您必须在 blank.html.twig 中调用 {{ twig|raw }},否则 Twig 将转义 HTML。另外:在将它提供给 Twig(再次)之前预渲染一个 Twig 模板感觉有点奇怪。

另一种方法是在 blank.html.twig 模板中加载模板:

{{ include(template_from_string(twig)) }}

template_from_string 函数是 StringLoaderExtension 的一部分。

文档在这里:https://twig.symfony.com/doc/3.x/recipes.html#loading-a-template-from-a-string


编辑:考虑到这一点,如果 blank.html.twig 实际上只是一个输出 {{ twig }}:

的文件,第三种方法可能会更简单
$template = $this->get('twig')->createTemplate($this->generateTwig());
return $template->render();