用YII2做RESTFUL風格的項目時對於有些view操作(請求單個資源的操作,即GET xxx.com/resouce/:id格式的操作),項目要求並不是簡單的使用model::findOne($id)查出來的數據就行了,但是如何自定義view的返回數據呢?
第一種方法顯而易見, override對應controller的actions(),把view操作的action的class指定成自己寫的viewAction:
public function actions(){
$as = parent::actions();
$as['view']['class'] = 'app\my_actions\viewAction'; //此viewAction繼承於yii\rest\viewAction,主要通過重寫run()函數實現自定義返回數據的功能
return $as;
}
但是yii2的guide中說index操作可以通過指定parent::actions()['index']['prepareDataProvider'] = [$this, 'methodNameInController']的方法指定controller裏的函數來自定義返回的數據,那爲什麼view操作必須要新建一個類來自定義返回數據呢?有沒有更簡單的方法,像index那樣指定controller裏面的函數來完成自定義?有,但是參數名不再是prepareDataProvider了,而是findModel,用法和index一樣parent::actions()['view']['findModel'] = [$this, 'methodNameInController']即可.這裏要注意的是methodNameInController函數需要對查詢結果做個判斷,若查不出需要throw一個Exception對象,否則會返回一個空內容的response.
這裏吐槽下爲什麼index和view操作的自定義返回數據的參數不一樣,害得我走了很多彎路