【问题标题】:Symfony2 - Twig render controller and return array responseSymfony2 - Twig 渲染控制器并返回数组响应
【发布时间】:2013-05-30 21:39:32
【问题描述】:

注意:我在这里所做的是embedding controllers (官方)示例。

我想从 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.") with the same twig file

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

这会引发上述异常。我怎样才能完成我所寻求的而不创建一个虚拟的、无用的额外模板供控制器渲染

【问题讨论】:

  • 您正在尝试做的是打破 MVP 模式(您正在尝试将逻辑放入视图层)。我的建议是重新考虑您的解决方案。也许如果你说更多你想要实现的我可以说更多。干杯!
  • 感谢@Cyprian 的回复,我确实觉得这样做不对,所以也许还有另一种方法。我的视图分为 3 个扩展布局模板的树枝模板:headersidebarcontent侧边栏 需要每个页面加载时的动态数据(例如,一些实时统计数据)。无论 content 模板中有什么内容,我都需要让侧边栏包含这些数据。
  • 我的目标是对侧边栏进行编码,从单独的控制器中检索它自己的数据,然后我以后编写的所有内容都只是内容页面,我不需要复制任何代码来获取侧边栏的统计信息。
  • 我会 json_encode() 响应中的数组并使用 twig 扩展在视图中对其进行解码:stackoverflow.com/questions/14500698/decoding-json-in-twig
  • 好的,我明白了——没关系。您应该为侧边栏创建自己的控制器操作,并将其包含在您的基本模板中。但相反,您的侧边栏操作会返回任何内容 - 它应该在自己的模板中呈现整个侧边栏视图。因此,调用: {% render(controller('AppBundle:Test:index')) %} 将生成整个侧边栏 htmlcode。我在想你想要什么吗?如果是这样,我将在答案中提供更广泛的示例。

标签: php symfony twig


【解决方案1】:

实现你想要的东西的标准方法是这样的。

假设您有常规操作。例如。

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 中)。

【讨论】:

  • 我想我担心抽象层次太多了,但这似乎是最好的做法。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多