众所周知,每个控制器必须有自己的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" ??
感谢。
答案 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(...))”。