将树枝代码传递到树枝模板并渲染它

Don*_*Msc 3 symfony twig

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

return $this->render('blank.html.twig', [
    'twig' => $this->generateTwig()
]);
Run Code Online (Sandbox Code Playgroud)

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

{{ twig }}
Run Code Online (Sandbox Code Playgroud)

但是当模板被渲染时,它里面只有未渲染的树枝代码,如下所示:

{% extends 'base.html.twig' %} {% block content %} <h1>{{ 'app-name'|trans }}...
Run Code Online (Sandbox Code Playgroud)

在这个例子中,你如何渲染注入的树枝代码?

做一个file_put_contents('blank', $this->generateTwig())作品,但这违背了使用模板的目的。

Bjo*_*orn 5

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

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

return $this->render('blank.html.twig', [
    'twig' => $twig,
]);
Run Code Online (Sandbox Code Playgroud)

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

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

{{ include(template_from_string(twig)) }}
Run Code Online (Sandbox Code Playgroud)

template_from_string函数是StringLoaderExtension.

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


编辑:想想看,如果blank.html.twig真的只是一个输出的文件,则第三种方法可能会更简单{{ twig }}

{{ include(template_from_string(twig)) }}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢那里的详细信息!您必须将其添加到 config/services.yaml 才能使 template_from_string 选项起作用,这是迄今为止最简单的选项: app.twig.extension.loader: class: Twig\Extension\StringLoaderExtension Tags: - { name: 'twig.extension '} (2认同)