訂單編號、建立時間、操作用戶 ID 等欄位不在表單中,需在儲存前自動賦值。
// models/Order.php
public function rules() {
return [
['order_no, created_at, user_id', 'required'], // 邏輯上必填,但由系統自動產生
['user_id', 'numerical', 'integerOnly' => true],
// 關鍵:default 驗證器在驗證階段自動填充
['created_at', 'default', 'value' => date('Y-m-d H:i:s')],
['order_no', 'default', 'value' => function() { return 'ORD' . date('YmdHis') . rand(100,999); }],
['status', 'default', 'value' => 0], // 預設狀態
// 搜尋場景安全屬性
['id, order_no, created_at, user_id, status', 'safe', 'on' => 'search'],
];
}
default 驗證器在 validate() 時執行,若屬性為 null/未設定,則注入 value。value 可為純量或 可呼叫物件(PHP 5.3+ 匿名函式),支援動態生成。skipOnEmpty 控制。// models/Order.php
protected function beforeSave() {
if ($this->isNewRecord) {
$this->order_no = 'ORD' . date('YmdHis') . rand(100,999);
$this->created_at = date('Y-m-d H:i:s');
$this->user_id = Yii::app()->user->id; // 取得當前登入用戶
$this->ip = Yii::app()->request->userHostAddress;
}
$this->updated_at = date('Y-m-d H:i:s'); // 每次更新都刷新
return parent::beforeSave(); // 必須返回 true 才會繼續儲存
}
beforeSave() 在 save() 內部、驗證通過後、資料庫寫入前呼叫。Yii::app()->user、request 等應用元件,適合需上下文資訊的欄位。return parent::beforeSave()(或 true),否則儲存中斷。$this->isNewRecord)。| 維度 | rules() default | beforeSave() |
|---|---|---|
| 執行時機 | validate() 階段 | save() 內部,驗證後 | 存取應用元件 | 不可(靜態上下文) | 可(Yii::app()->user 等) |
| 動態值支援 | 可(匿名函式) | 可(任意 PHP 邏輯) |
| 區分新增/更新 | 不可直接區分 | 可 (isNewRecord) |
| 適用欄位 | 固定預設、時間戳、隨機碼 | 用戶 ID、IP、關聯資料、複雜計算 |
| 可見性 | 規則集中可見 | 方法內部,需閱讀代碼 |