Yii 2 ArrayDataProvider的一些心得
在Yii 2中,頁面上用表格顯示數據時,一般是用數據提供器(Data Provider)來給表格作為數據源,這個思路就是不管你數據來源是什麽,但是最終提供給頁面表格顯示的時候,其格式和接口都是一致的,這樣就有效的實現了前後臺的解耦。
在實際開發中,最常用的是ActiveDataProvider和SqlDataProvider,一個是使用ORM的方式從數據庫獲取數據,另一種是直接使用SQL語句獲取數據,各有各的適用場合,使用起來也非常方便。
在Yii 2中,還提供了ArrayDataProvider,顧名思義,就是用數組作為數據源,這個用的比較少,因此一開始的時候還是有點生疏。
基本思路
簡單跟蹤一下代碼就可以知道,前端表格在顯示數據的時候,其核心是要求數據以關聯數組的數組形式提供出來,所以使用ArrayDataProvider的時候,也是以這種形式提供數據就好了,基本的數組格式類似如下:
$data = [
[
‘name‘ => ‘zhangfei‘,
‘age‘ => 20,
],
[
‘name‘ => ‘guanyu‘,
‘age‘ => 20,
],
]
其實這個結構,跟使用Model查詢得到的數據asArray()出來的結果是一樣的。
實現流程
定義Model
首先,要按照顯示的數據內容,定義一個Model,其實不定義Model也可以,只要按照顯示的要求組織好關聯數組就可以了,但是定義Model,可以方便未來實現查詢、過濾。
Model的定義大致如下:
class ArrStudentModel extends Model { public $name; public $age; /** * @inheritdoc */ public function rules() { return [ [[‘name‘], ‘string‘], [[‘age‘], ‘integer‘] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ ‘name‘ => ‘姓名‘, ‘age‘ => ‘年齡‘, ]; } }
看這個Model的結構是不是很眼熟,沒錯,跟使用Yii 2的工具自動生成的表Model是一樣一樣的,當然,懶一點,不繼承實現rules()和attributeLabels()也是沒問題的。不過,rules()可以為以後自動查詢提供默認的規則,而attributeLabels()可以為表格提供列標題的文字,所以搞一個Model比較合適。
查詢
查詢的做法也很簡單,跟ActiveRecord同樣處理,在Model中提供查詢的接口即可。
Yii 2 ArrayDataProvider的一些心得