2012-12-25 45 views
4

在Zend Framework 2中,如果HTTP accept头设置为“application/json”,否则我想返回JSON,否则返回HTML。我正在使用新的acceptableViewModelSelector控制器插件,就像在example in the 2.0.4 changelog中一样。基于accept头的ZF2返回格式

我有以下代码:

class IndexController extends AbstractActionController { 
    private $acceptCriteria = array(
     'Zend\View\Model\JsonModel' => array('application/json'), 
     'Zend\View\Model\FeedModel' => array('application/rss+xml') 
    ); 

    public function jsonAcceptHeaderAction() { 
     $view_model = $this->acceptableViewModelSelector($this->acceptCriteria); 

     return $view_model; 
    } 
} 

如果我这样设置接受头:

curl -H "Accept: application/json" http://mydomain.com/json

然后控制器插件返回如预期的那样JsonModel实例。不过,看来总是这样做,即使在我的接受头文件中没有application/json。例如,如果我访问的页面在Chrome中,以下接受头被发送:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

我也得到JSON回来,如果我用curl http://mydomain.com/json。控制器插件有一个默认视图模型名称,我期望它在使用我的接受条件时找不到匹配项时使用。该更新日志说以下内容:

如果 特定条件满足以上将返回一个标准的Zend \查看\型号\视图模型实例 如果条件不满足,并指定视图模型类型。

我试图改变我的接受标准为以下,结果是做我想做的。

private $acceptCriteria = array(
     'Zend\View\Model\ViewModel' => array('text/html'), 
     'Zend\View\Model\JsonModel' => array('application/json'), 
     'Zend\View\Model\FeedModel' => array('application/rss+xml') 
    ); 

我只是想知道为什么它不使用默认的视图模型的名字时,有没有application/json接受头,因为我最好要离开了,我接受的标准阵列中的第一项。

有没有人知道为什么我总是得到一个JsonModel对象,除非我做上面的改变?

回答

0

如果您没有文本/ html条目,如果您使用任何能够接受json的浏览器访问url,则接受条件是默认视图模型有效,代码没有问题将匹配第一个条目,即application/json。

要测试默认的模型正在测试用如下卷曲您的网址没有acceptableviewmodel阵列中的text/html的进入,你会得到默认的视图模型输出

curl -H "Accept: text/html" http://mydomain.com/json 

这将返回默认视图模型,所以按照您期望的方式工作,您需要输入text/html,将条目按照您的首选顺序排列在数组中

+0

控制器插件如何知道我的浏览器能够接受JSON?它与'text/html'接受标题有关,因为JSON是文本?如果是这样,那么我想这应该在控制器插件的源代码中以某种方式透明,但我不记得有关它的任何事情。或者是'*/*'是一个通配符,这样我的浏览器就可以接受任何东西 - 一种回退?当我没有在accept头中指定'application/json'时,我仍然有点困惑,为什么它使用'JsonModel'。 – Andy0708