透過前面的學習,我們已了解 Yii Web 應用程式的基本組成,並能撰寫如 Hangman 猜單字遊戲這類簡單應用。在第一篇教程中介紹過,Yii 採用 MVC 模式,本系列旨在以 Windows 桌面應用或 ASP.NET 程式設計師的視角,協助他們快速掌握 PHP Yii Framework。
前面介紹了透過 CHtml 建立視圖(表單)、透過 CController 處理使用者提交事件。若與 Windows 桌面應用或 ASP.NET 類比:Yii 的視圖 類似 WinForm 或 ASP.NET Page;控制器 類似事件處理類別。不同之處在於 ASP.NET 和 Windows 應用可為 UI 元件定義 ID 並綁定事件處理,而 PHP/Yii 沒有對應機制。不過 Yii 提供了 CFormModel 來支援類似功能:透過 CFormModel,可為 HTML 表單中的 UI 元件定義變數,並在控制器中存取這些變數。每個 Yii 視圖通常提供一個「提交」按鈕,使用者點擊後觸發控制器對應的 actionXXX 方法,在該方法中可透過 CFormModel 取得表單元件的值。
Yii 中的模型是 CModel 或其子類別的實例,用於保持資料及相關業務邏輯。Yii 實作兩種模型:
CFormModel 實例,用於保持從使用者輸入取得的資料,這些資料常被取得、使用後丟棄(如登入頁面的使用者名稱與密碼)。CActiveRecord 或其子類別實例,代表資料表中的一列,欄位對應 AR 物件屬性。詳細內容將在資料庫章節介紹。本篇透過一個簡單的登入介面示範 FormModel 用法。
建立 LoginForm(protected/models/LoginForm.php)模型類別,用於收集登入頁面的使用者輸入。因登入資訊僅用於驗證,無需儲存,故建立為表單模型:
class LoginForm extends CFormModel {
public $username;
public $password;
public $rememberMe = false;
}
使用者提交輸入後,模型被填充,我們需在使用前確保輸入有效。透過 rules() 方法指定驗證規則,回傳規則設定陣列:
class LoginForm extends CFormModel {
public $username;
public $password;
public $rememberMe = false;
private $_identity;
public function rules() {
return array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'),
);
}
public function authenticate($attribute, $params) {
$this->_identity = new UserIdentity($this->username, $this->password);
if (!$this->_identity->authenticate()) {
$this->addError('password', '錯誤的使用者名稱或密碼。');
}
}
}
上述代碼指定:username 和 password 為必填;password 需經驗證;rememberMe 應為布林值。
rules() 回傳的每個規則格式如下:
array('AttributeList', 'Validator', 'on' => 'ScenarioList', ...附加選項)