根据 Yii2 源码(yii\filters\ContentNegotiator
),内容协商(ContentNegotiator)有返回 内容格式 和 内容语言 两种,这里我们主要说一下 内容格式。
我们常用的内容格式有
- FORMAT_RAW
- FORMAT_HTML
- FORMAT_JSON
- FORMAT_JSONP
- FORMAT_XML
ContentNegotiator 内容协商是干嘛的?它可以分析 Request 的 header,然后指派所需的响应格式给客户端,不需要我们人工指定。
ContentNegotiator 既可以是应用级的,也可以是模块级的,还可以是控制器级的。
应用和模块级
在这两个级别层次,我们可以在 config 中这样来编写
'bootstrap' => [
'log',
[
'class' => 'yii\filters\ContentNegotiator',
'formats' => ['application/json' => yii\web\Response::FORMAT_JSON]
]
]
控制器级
在此级别层次,我们可以在控制器的 behaviors()
中来定义
public function behaviors(){
return [
'ContentNegotiator' => [
'only' => ['index', 'list'],
'class' => 'yii\filters\ContentNegotiator',
'formats' => ['application/json'=>Response::FORMAT_JSON]
]
];
}
这样我们就可以来定义响应的格式。上面两例中我们只是定义了 JSON 这一种格式。在这种情况下,请求的 header 中不论设置的是什么格式,最后返回的都是 JSON。
如果我们要设置多种相应格式,那么编写方法如下
public function behaviors(){
return [
'ContentNegotiator' => [
'only' => ['index', 'list'],
'class' => 'yii\filters\ContentNegotiator',
'formats' => [
'text/html' => Response::FORMAT_HTML,
'application/xml' => Response::FORMAT_XML,
'application/json' => Response::FORMAT_JSON,
]
]
];
}