6

注意:我在这里做的是嵌入控制器<--- 查看该链接以获取类似的(官方)示例。

我想从 twig 模板调用控制器,并让该控制器返回一个数组,然后我可以在模板的其余部分使用该数组。

我可以用单个变量来做到这一点:

枝条

{% set testVar = render(controller('AppBundle:Test:index')) %}

控制器

class TestController extends Controller
{
    public function testAction()
    {
        return new Response('OH HAI');
    }
}

但是,以下会引发异常:("The Response content must be a string or object implementing __toString(), "array" given.") 使用相同的 twig 文件

public function testAction()
{
    return new Response(array('test' => 1, 'foo' => 'bar'));
}

这会引发上述异常如何在不创建虚拟的、无用的额外模板供控制器渲染的情况下完成我所寻求的目标?

4

1 回答 1

6

实现你想要的东西的标准方法看起来像这样。

让我们假设你有你的常规动作。例如。

class TestController extends Controller
{
    public function testAction()
    {
        return $this->render('AppBundle:Test:index.html.twig');
    }
}

和模板:

<html>
    <body>
        {% block sidebar %}
            {{ controller('AppBundle:Test:sidebar') }}
        {% endblock %}
        {% block content %}
            Hello world
        {% endblock %}                    
    </body>
</html>

接下来,您需要为侧边栏创建一些操作。请注意,通过这种方式,您可以避免将任何逻辑放入视图层。

class BaseController extends Controller
{
    public function sidebarAction()
    {
        $status = $this->get('some.status.logic')->retrieveStatus();

        return $this->render('AppBundle:Base:sidebar.html.twig', array(
            'status' => $status,
        ));
    }
}

你的Base/sidebar.html.twig

<div class="sidebar">
   {{ status.showStatusInfo() }}
</div>

就这样。您不会以这种方式破坏 MVP,因为您的视图层中仍然没有任何逻辑(侧边栏的逻辑在 中BaseController)。

于 2013-06-04T14:29:48.710 回答