模型是 mvc 模式中的一部分, 是代表業務資料、規則和邏輯的物件。
可通過繼承 [[yii\base\model]] 或它的子類定義模型類,基類[[yii\base\model]]支援許多實用的特性:
屬性: 代表可像普通類屬性或陣列一樣被訪問的業務資料;
屬性標籤: 指定屬性顯示出來的標籤;
塊賦值: 支援一步給許多屬性賦值;
驗證規則: 確保輸入資料符合所申明的驗證規則;
資料匯出: 允許模型資料匯出為自定義格式的陣列。
屬性:
所有 non-static public非靜態公有 成員變數都是屬性,如果是對應資料庫的模型,我發現表的字段都是他的屬性,而且是預設已經宣告的,可以不用在手動宣告。
屬性標籤:
這個主要是在檢視中使用,而且為了統一修改,很方便的。通過方法 attributelabels 返回乙個陣列或物件,我發現2.0以後的多少用物件代替了以前的陣列方式。
1public
function
attributelabels()
場景:
乙個模組可以在多個場景下使用,比如使用者模型可以在註冊和登入場景下使用,而且他們的驗證規則甚至屬性標籤會有所不同,這就有了場景存在的必要性。可以通過 scenarios函式來實現。
1public
function
scenarios()
其中 $scenarios = parent::scenarios(); 可以保持預設場景的情況下,設定新場景的情況。
驗證規則:
主要是針對表單的輸入內容作出驗證,比如使用者名稱不能為空,email不能為空且必須是個郵箱的格式等等。可呼叫 [[yii\base\model::validate()]] 來驗證接收到的資料, 該方法使用[[yii\base\model::rules()]]申明的驗證規則來驗證每個相關屬性, 如果沒有找到錯誤,會返回 true,否則它會將錯誤儲存在 [[yii\base\model::errors]] 屬性中並返回false。
1$model = new23
//使用者輸入資料賦值到模型屬性45
6if ($model->validate()) else
1public
function
rules()
在rules方法中還可以標明這個規則是在哪個場景下使用的,如不是所有場景的話,就省去 'on'=>'',一行可以設定多個欄位的規則也可以多行設定乙個欄位的規則,根據實際情況來做。
塊賦值:
這個其實是個很好的東西,可以快速賦值表單傳來的值,比如下面的賦值方式就把整個 contactform 表單的值賦值過來了。
$model = new安全屬性:
塊賦值只應用在模型當前[[yii\base\model::scenario|scenario]]場景[[yii\base\model::scenarios()]]方法 列出的稱之為 安全屬性 的屬性上,例如,如果user模型申明以下場景, 當當前場景為login時候,只有username and password 可被塊賦值,其他屬性不會被賦值。
public
function
scenarios()
由於預設[[yii\base\model::scenarios()]]的實現會返回[[yii\base\model::rules()]]所有屬性和資料, 如果不覆蓋這個方法,表示所有只要出現在活動驗證規則中的屬性都是安全的。
為此,提供乙個特別的別名為 safe 的驗證器來申明哪些屬性是安全的不需要被驗證, 如下示例的規則申明 title 和 description 都為安全屬性。
publicfunction
rules()
非安全屬性:
相對於安全屬性就有非安全屬性,在某些情況下,你可能想驗證乙個屬性但不想讓他是安全的,可在scenarios()方法中屬性名加乙個驚嘆號 !。例如像如下的secret屬性。他的賦值就要單獨的顯式賦值。
publicfunction
scenarios()
$model->secret = $secret;
資料匯出:
其實簡單說就是獲取資料表的乙個結果集,最簡單的就是使用 attributes方法。
$array = $post->attributes;
更靈活和強大的將模型轉換為陣列的方式是使用 [[yii\base\model::toarray()]] 方法, 它的行為預設和 [[yii\base\model::attributes]] 相同, 但是它允許你選擇哪些稱之為欄位的資料項放入到結果陣列中並同時被格式化。 實際上,它是匯出模型到 restful 網頁服務開發的預設方法。
字段:
欄位是模型通過呼叫[[yii\base\model::toarray()]]生成的陣列的單元名。預設情況下字段和屬性是對應的。但是你可以通過覆蓋 [[yii\base\model::fields()|fields()]] 和/或 [[yii\base\model::extrafields()|extrafields()]] 方法來改變這種行為, 兩個方法都返回乙個字段定義列表,fields() 方法定義的字段是預設字段,表示toarray()方法缺省會返回這些字段。 extrafields()方法定義額外可用字段,通過toarray()方法指定$expand引數來返回這些額外可用字段。 例如如下**會返回fields()方法定義的所有欄位和extrafields()方法定義的prettyname and fulladdress欄位。
$array = $model->toarray(, ['prettyname', 'fulladdress']);
可通過覆蓋 fields() 來增加、刪除、重新命名和重定義字段,fields() 方法返回值應為陣列, 陣列的鍵為欄位名,陣列的值為對應的可為屬性名或匿名函式返回的字段定義對應的值。 特使情況下,如果欄位名和屬性定義名相同,可以省略陣列鍵,例如:
//明確列出每個字段,特別用於你想確保資料表或模型屬性改變不會導致你的字段改變(保證後端的api相容).
public
function
fields(),];}//
過濾掉一些字段,特別用於你想繼承父類實現並不想用一些敏感字段
public
function
fields()
除了上面說的模型自身的東西外,在使用的時候也應注意一些事情:
不應直接訪問請求,session和其他環境資料,這些資料應該由控制器傳入到模型;
應避免嵌入html或其他展示**,這些**最好在 檢視中處理;
單個模型中避免太多的 場景.
在開發大型複雜系統時應經常考慮最後一條建議, 在這些系統中,模型會很大並在很多地方使用,因此會包含需要規則集和業務邏輯, 最後維護這些模型**成為乙個噩夢,因為乙個簡單修改會影響好多地方, 為確保模型好維護,最好使用以下策略:
例如,在高階應用模板,你可以定義乙個模型基類common\models\post, 然後在前台應用中,定義並使用乙個繼承common\models\post的具體模型類frontend\models\post, 在後台應用中可以類似地定義backend\models\post。 通過這種策略,你清楚frontend\models\post只對應前台應用,如果你修改它,就無需擔憂修改會影響後台應用。
Yii框架2 0的模組
模組是個獨立的軟體單元,也是又控制器,檢視,模型組成的,也可以有自己的布局。但他必須屬於某個應用下,不能獨立存在。其中模組的控制器,檢視和應用的控制器和檢視使用基本相同,不作贅述,下面說說模組的使用。首先可以通過前面說的gii來生成乙個模組,然後配置模組,再web.php 配置檔案裡加入下面的東西。...
Yii框架2 0的小部件
小部件是檢視裡的可重用單元。小部件是在檢視中使用的,但是可能需要使用控制器傳給他的模型,比如在渲染表單的時候。比如一般的時間拾取器就可以直接砸檢視裡加入如下 就可以 useyii jui datepicker date 如果用到model 就大致是這樣的 useyii jui datepicker ...
yii2 0框架報錯
在action中執行echo,var dump等方法後沒有中斷,yii1.0中ajax方法返回資料可以直接通過echo獲取,但是yii2.0的response類中增加了對於返回輸出資訊的定義,所以當echo後沒有中斷程式,yii自帶的 就會出錯,不過目前我發現的情況是,只有在返回的資料結構複雜的情況...