如何告诉ZF2的JsonModel返回text / plain而不是application / json?

时间:2012-10-10 13:23:44

标签: php json zend-framework2

使用PHP Zend Framework 2.0.2,我在AJAX调用后返回JSON数据。显然,Internet Explorer 9想要下载数据而不是将其返回到调用Javascript方法。

this onethis one等帖子说要使用Content-Type: text/plain代替Content-Type: application/json,但我如何使用ZF2的JsonModel执行此操作?我是新来的......

我想我必须在setOptions()数组中设置一些东西,但是什么?

public function testJsonAction()
{
   $jsonResponse = new JsonModel(array('success' => false));

   $jsonResponse->setOptions(array(
         // ** Should I put something here? What? **
   ));

   return $jsonResponse;
}

我尝试过使用这些:

  $this->getResponse()->getHeaders()->addHeaderLine('Content-Type', 'text/plain');
  $this->getResponse()->getHeaders()->addHeaderLine('Content-Disposition', 'inline; filename="textdata.json"');

但它不会更改响应标头中的HTTP Content-Type:

Key                   Value
Response              HTTP/1.1 200 OK
Content-Type          application/json
Server                Microsoft-IIS/7.5
X-Powered-By          PHP/5.3.13
Set-Cookie            ZDEDebuggerPresent=php,phtml,php3; path=/
Content-Disposition   inline; filename="textdata.json"
X-Powered-By          ASP.NET
Date                  Wed, 10 Oct 2012 13:19:42 GMT
Content-Length        17

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

因为当\ Zend \ Mvc \ MvcEvent :: EVENT_RENDER事件发生时,JsonStrategy将再次更改内容类型。源代码在

的Zend \视图\策略\ JsonStrategy-> injectResponse();

因此,为了将内容类型替换为您的内容类型,您需要在注入JsonStrategy之后使用EventManager注入自定义标头。

在控制器中尝试以下代码:

 $this->getServiceLocator()->get('Application')->getEventManager()->attach(\Zend\Mvc\MvcEvent::EVENT_RENDER, function($event){
     $event->getResponse()->getHeaders()->addHeaderLine('Content-Type', 'text/plain');
 }, -10000);