symfony twig 渲染动态树枝代码

symfony twig render dynamic twig code

在我的 symfony2 操作中,我有:

$twigCode = '<li>{{ data.value }}</li>'; //In database
$datas = array(array( 'value' => 'line 1'), array( 'value' => 'line 2'));

return $this->render(
    '...List.html.twig',
    array(
        'twigCode' => $twigCode,
        'datas' => $datas
    )
);

在我的树枝模板中,我想要这样的东西:

<ul>
{% for data in data %}
    {{ render({{ twigCode }}, {data: data}) }}
{% endfor %}
</ul>

预计:

<ul>
    <li>line 1</li>
    <li>line 2</li>
</ul>

您将不得不使用 twig 核心或者可能是自定义视图渲染

检查下面的代码

$loader = new Twig_Loader_Array(array(
'index.html' => 'Hello {{ name }}!',
));
$twig = new Twig_Environment($loader);

echo $twig->render('index.html', array('name' => 'Fabien'));

在此处查看文档:http://twig.sensiolabs.org/doc/api.html#built-in-loaders

您可以在控制器中渲染和连接树枝片段:

$templating = $this->container->get('templating');
$someTwig = '';

foreach ($datas as $data)
{
    $someTwig .= $templating->render($twigCode, $data);
}

return $this->render('...List.html.twig', array('someTwig' => $someTwig));

然后在树枝中:

<ul>
    {{ someTwig | raw }}
</ul>

否则,如果您真的想在 twig 中执行此操作,您可以编写一个 Custom Twig Extension 来实现 twig 函数 'render',以便像您建议的 twig 片段这样的东西可以工作:

在 twig 扩展中(您需要将其注册为服务,参见上面的 link):

class MyTwigExtension extends \Twig_Extension 
{
    private $templating;

    public function__construct($templating)
    {
        $this->templating = $templating;
    }

    public function getFunctions()
    {
        return array(
            'render' => new \Twig_Filter_Method($this, 'render'), 
        );
    }

    public function render($twigFragment, array $data)
    {
        return $this->templating->render($twigFragment, $data);
    }
}

然后在树枝中:

<ul>
{% for data in data %}
    {{ render(twigCode, data) | raw }}
{% endfor %}
</ul>

注意 - 'render' 可能是 twig 的保留字,因此自定义 twig 函数可能需要不同的名称。