0

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

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

_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时,视图“myname.json.twig”将显示,但是,实际上每个 json tempalte 都是一样的,我怎么能让 symfony2 知道:

当用户请求 /xxx/yyy.html 时,正常渲染“myname.html.twig”
当用户请求 /xxx/yyy.json 时,渲染其他模板如“default.json.twig”而不是“myname.json.twig” “??

谢谢。

4

1 回答 1

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 文件。而且您不能使用模板,而只能在您的操作中返回“new Response(json_encode(...))”。

于 2012-07-13T05:04:33.817 回答