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