【发布时间】: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 个扩展布局模板的树枝模板:header、sidebar 和 content。 侧边栏 需要每个页面加载时的动态数据(例如,一些实时统计数据)。无论 content 模板中有什么内容,我都需要让侧边栏包含这些数据。
-
我的目标是对侧边栏进行编码,从单独的控制器中检索它自己的数据,然后我以后编写的所有内容都只是内容页面,我不需要复制任何代码来获取侧边栏的统计信息。
-
我会 json_encode() 响应中的数组并使用 twig 扩展在视图中对其进行解码:stackoverflow.com/questions/14500698/decoding-json-in-twig
-
好的,我明白了——没关系。您应该为侧边栏创建自己的控制器操作,并将其包含在您的基本模板中。但相反,您的侧边栏操作会返回任何内容 - 它应该在自己的模板中呈现整个侧边栏视图。因此,调用: {% render(controller('AppBundle:Test:index')) %} 将生成整个侧边栏 htmlcode。我在想你想要什么吗?如果是这样,我将在答案中提供更广泛的示例。