在symfony2中为所有json响应使用1个模板

时间:2012-07-13 03:51:26

标签: json templates symfony

众所周知,每个控制器必须有自己的json响应模板,如何强制所有json响应使用相同的模板?

简单来说,我的cotronller /路由器看起来像这样:

_myname:
    pattern: /xxx/yyy.{_format}
    defaults: { _controller: bundle:class:myname, _format:html }
    requirements:{ _format: html|json }


/**
* @Template()
*/
public function mynameAction(){
    return array("data"=>array("error"=>1, "msg"=>"msg"))
}

好的,现在效果很好,当用户请求/xxx/yyy.html时,控制器将呈现视图" myname.html.twig",当用户请求/xxx/yyy.json时,查看& #34; myname.json.twig"会显示,但是,实际上每个json tempalte都是一样的,我怎么能让symfony2知道:

当用户请求/xxx/yyy.html时,呈现" myname.html.twig"像往常一样 当用户请求/xxx/yyy.json时,呈现其他模板,例如" default.json.twig"而不是" myname.json.twig" ??

感谢。

1 个答案:

答案 0 :(得分:1)

如你所知,我们有Twig。有了twig,我们可以扩展一些模板。你可以像这样创建一个基本的json文件:

/Symfony/app/Resources/views/base.json
{
    "success": {% block success %}true{% endblock %},
    "user": {% block user %}guest{% endblock %},
    "items": {% block items %}[]{% endblock %}
}

在所有捆绑包中,您可以将任何模板定义为base.json

的扩展名
{% extends '::base.json' %}

{% block success %}{{ success }}{% endblock %}
{% block user %}app.user{% endblock %}
{% block items %}['one','two','three']{% endblock %}

您还可以创建一种工厂类。这个类总是可以在特定的json结构中返回一个json文件。并且您无法使用模板,只需在您的操作中返回“新响应(json_encode(...))”。