在我的webapplication中,我总是用JSON回复AJAX调用 因此,我发现自己在很多行动中都这样做了:
if ($request->isXmlHttpRequest()) {
$this->getResponse()->setHttpHeader('Content-type', 'application/json');
return $this->renderText(json_encode($details));
}
有没有办法自动获取:只要请求是AJAX,内容类型是JSON?
我在想我应该使用过滤器,但我不熟悉过滤器,也许有更好的解决方案。
任何建议都非常受欢迎。
谢谢,
丹
答案 0 :(得分:3)
我解决它的方式:
创建一个从myActions
延伸的新类sfActions
。在此类中创建一个新函数renderJson($data)
:
protected function renderJson($data) {
$this->getResponse()->setHttpHeader('Content-type', 'application/json');
return $this->renderText(json_encode($data));
}
现在让您的控制器类继承自myActions
(而不是sfActions
)。在控制器的末尾只有return $this->renderJson($data);
。
(我还在renderJson中做了一些模板化,如果在配置中设置了sf_debug
,并且没有通过XmlHttp请求它。)
答案 1 :(得分:0)
我在我的一个项目中使用了类似的技术,但我建议你看一下关于iPhone优化的this article。您可以将路由设置为接受格式并根据该模板返回相应的模板。然后,您不需要设置标头,因为它是按请求的格式设置的。
当然,这意味着您需要为每个输出模板创建单独的模板文件,这似乎很麻烦,或者使用特定的布局文件并跳过模板。所以最终它可能几乎相同(或至少相同数量的代码)。