經過分析Request的header來返回對應的數據格式。php
在開始以前咱們先說一下yii2的Response類內置均可以返回什麼類型的響應格式,一共5種,固然你也能夠自定義其餘的。web
在咱們響應瀏覽器的時候能夠設置如上的格式。json
ContentNegotiator是幹嗎的?它能夠分析Request的header而後指派所需的響應格式給客戶端,不須要咱們人工指定,固然它也是action的篩選器,好比ContentNegotiator限定了只能返回FORMAT_JSON,則就算客戶端請求一個xml格式的數據,也徒勞。bootstrap
通常ContentNegotiator都是做爲action篩選器使用,看它的層級關係一目瞭然。瀏覽器
它是篩選器,它也是行爲。restful
有一個控制器叫作NegController,它有兩個action,我但願都返回json類型的數據,則能夠這樣配置。yii2
就是綁定了一個行爲,經過配置ContentNegotiator的formats能夠限定返回的類型,而且能夠指定只是針對於index和list有效,固然若是你只想剔除某個action,可使用except參數。app
接下來咱們看看actionIndex,咱們其實返回了一個結果集。看看瀏覽器端的表現。yii
你們看到了,忽略了Request對響應格式的說明,而且將結果集轉換成json格式直接返回。3d
固然咱們能夠指定多種,這樣yii2會根據Request中header的accept字段進行分析。好比下圖
好比我設定我想接收json類型的數據,則ContentNegotiator會對其進行匹配。
這是第一種方法,咱們能夠針對於一個控制器進行篩選和內容協商,另外咱們能夠針對於整個yii2程序進行協商,好比你的程序是手機應用的接口後臺,所有須要json格式。
就是上面的需求,咱們能夠在配置文件裏進行處理 config/web.php,由於ContentNegotiator要在action以前分析過來的請求頭,所以對於全局設置,咱們須要放到web.php的bootstrap進行預加載。
簡單的設置一下,整個程序都返回json格式了。
針對於普通程序可能這種響應格式統一化還不明顯,不過針對於好比app就很重要了,或是統一返回xml、或是json,他們表明純數據。
在yii2的RESTful模塊中,ContentNegotiator也起到了重要做用而且貫穿於全部的控制器。
咱們都知道對於RESTful,每一個控制器須要繼承ActiveController,而ActiveController又是yii\rest\Controller的子類。在yii\rest\Controller中咱們發現了以下代碼。
你明白了吧,也就是說全部的RESTful下的action都返回xml或json格式的數據,具體是誰能夠根據請求header來。關於這點,咱們在開發RESTful程序時候要特別注意。
固然不單單如此,ContentNegotiator還能夠根據語言進行協商並返回對應的數據,感興趣的夥伴能夠自行研究下,思路差很少。