驗證代碼,這塊代碼就是model裏面最最常見的代碼塊了。另外在基本的save、update這些方法的調用裏面也會做校驗,所以不需要額外手工再調一次這麼麻煩。
// 用用戶輸入來填充模型的特性
$model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// 若所有輸入都是有效的
} else {
// 有效性驗證失敗:$errors 屬性就是存儲錯誤信息的數組
$errors = $model->errors;
}
yii\base\Model::rules()函數的規則格式:
[
// 必須項,用於指定那些模型特性需要通過此規則的驗證。
// 對於只有一個特性的情況,可以直接寫特性名,而不必用數組包裹。
['attribute1', 'attribute2', ...],
// 必填項,用於指定規則的類型。
// 它可以是類名,驗證器暱稱,或者是驗證方法的名稱。
'validator',
// 可選項,用於指定在場景(scenario)中,需要啓用該規則
// 若不提供,則代表該規則適用於所有場景
// 若你需要提供除了某些特定場景以外的所有其他場景,你也可以配置 "except" 選項
'on' => ['scenario1', 'scenario2', ...],
// 可選項,用於指定對該驗證器對象的其他配置選項
'property1' => 'value1', 'property2' => 'value2', ...
]
自定義錯誤信息
大多數的驗證器都有默認的錯誤信息,當模型的某個特性驗證失敗的時候,該錯誤信息會被返回給模型。
可以通過在聲明規則的時候同時指定 message 屬性,來定製某個規則的錯誤信息。
public function rules()
{
return [
['username', 'required', 'message' => 'Please choose a username.'],
];
}
一些驗證器還支持用於針對不同原因的驗證失敗返回更加準確的額外錯誤信息。比如,yii\validators\NumberValidator 驗證器就支持 yii\validators\NumberValidator::tooBig 和 yii\validators\NumberValidator::tooSmall 兩種錯誤消息用於分別返回輸入值是太大還是太小。
條件式驗證
若要只在某些條件滿足時,才驗證相關特性,比如:是否驗證某特性取決於另一特性的值,你可以通過 yii\validators\Validator::when 屬性來定義相關條件。這個功能可以用於判斷一些關聯字段的必填非必填關係。
eg
[
['state', 'required', 'when' => function($model,$attribute) {
return $model->country == 'USA';
}],
]
若你需要支持客戶端的條件驗證,你應該配置 yii\validators\Validator::whenClient 屬性,它會讀入一條包含有 JavaScript 函數的字符串。這個函數將被用於確定該客戶端驗證規則是否被啓用。
[
['state', 'required', 'when' => function ($model) {
return $model->country == 'USA';
}, 'whenClient' => "function (attribute, value) {
return $('#country').value == 'USA';
}"],
]
數據預處理
trim、default、filter 這些過濾器都可以對數據進行預處理。
處理空輸入
當輸入數據是通過 HTML 表單,你經常會需要給空的輸入項賦默認值。你可以通過調整 default 驗證器來實現這一點。
默認情況下,當輸入項爲空字符串,空數組,或 null 時,會被視爲“空值”。你也可以通過配置 yii\validators\Validator::isEmpty 屬性來自定義空值的判定規則。
對於絕大多數驗證器而言,若其 yii\base\Validator::skipOnEmpty 屬性爲默認值 true,則它們不會對空值進行任何處理。
臨時驗證
有時,你需要對某些沒有綁定任何模型類的值進行 臨時驗證。
- 可以調用所需驗證器的 yii\validators\Validator::validate() 方法。
- 若你需要針對一系列值執行多項驗證,你可以使用 yii\base\DynamicModel 。
創建驗證器(Validators)
自定義的驗證器可以是行內驗證器,也可以是獨立驗證器。
- 行內驗證器(Inline Validators)
行內驗證器是一種以模型方法或匿名函數的形式定義的驗證器。
- 獨立驗證器(Standalone Validators)
獨立驗證器是繼承自 yii\validators\Validator 或其子類的類。