ZF2返回格式基于accept头

时间:2012-12-25 19:18:00

标签: php http-headers zend-framework2

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

一样

我有以下代码:

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

如果我使用curl http://mydomain.com/json,我也会收到JSON。控制器插件有一个默认的视图模型名称,我希望它在找不到与我的接受标准匹配时使用。更改日志说明如下:

  

以上将返回标准的Zend \ View \ Model \ ViewModel实例   如果未满足条件,则指定的视图模型类型如果   符合特定标准。

我试图将接受标准改为以下内容,结果证明是我想做的。

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对象,除非我做了上面的更改吗?

1 个答案:

答案 0 :(得分:0)

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

要测试默认模型是否正在使用curl测试您的网址,如果没有acceptviewmodel数组中的 text / html 条目,您将获得默认的视图模型输出

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

这将返回默认的视图模型,因此要按照您的预期工作需要输入 text / html ,请将条目放在数组中,并附上您的首选订单