Yii2架構資料驗證操作執行個體詳解

來源:互聯網
上載者:User
這篇文章主要介紹了Yii2架構資料驗證操作,結合執行個體形式詳細分析了Yii架構常見資料驗證操作的原理、實現方法及相關操作技巧,需要的朋友可以參考下

本文執行個體講述了Yii2架構資料驗證操作。分享給大家供大家參考,具體如下:

一、情境

什麼情況下需要使用情境呢?當一個模型需要在不同情境中使用時,若不同情境下需要的資料表欄位和資料驗證規則有所不同,則需要定義多個情境來區分不同使用情境。例如,使用者註冊的時候需要填寫email,登入的時候則不需要,這時就需要定義兩個不同情境加以區分。

預設情況下模型的情境是由rules()方法申明的驗證規則中使用到的情境決定的,也可以通過覆蓋scenarios()方法來更具體地定義模型的所有情境,例如:

public function scenarios() {    return [      'signup' => ['username', 'email', 'password', 'conpassword', 'verifyCode', 'reg_time', 'log_time'],      'login' => ['username', 'password', 'verifyCode', 'rememberMe', 'log_time']    ];}

其中鍵為情境名稱,值為該情境下使用的模型屬性(稱為活動屬性)。

指定模型情境有以下兩種方法:

方法一:

$model = new User();$model->scenario = 'signup';

方法二:

$model = new User(['scenario' => 'signup']);

可以通過指定驗證規則中的'on'屬性來申明一條驗證規則適用的情境:

['email', 'required', 'on' => 'signup']

情境主要用於模型屬性塊賦值和資料驗證。調用模型類的load()方法進行塊賦值的時候,只有當前情境對應使用的屬性會被賦值,調用模型類的validate()方法進行資料驗證的時候,只有當前情境屬性相關的且適用於當前情境的驗證規則會被執行。

二、驗證規則

Yii模型類通過實現rules()方法申明使用的所有驗證規則,樣本:

public function rules() {    return [      [['username', 'password'], 'required'],      ['email', 'email', 'on' => 'signup']    ];}

一條規則可適用於一個或多個情境,一條規則可用來驗證一個或多個屬性,一個屬性可對應一條或多條驗證規則。如果沒有指定'on'屬性,驗證規則會在所有情境下使用。

所有的驗證規則都可以通過設定'message'屬性來自訂錯誤資訊,而且在錯誤資訊內容中可以通過{attribute}來引用當前屬性標籤名稱(屬性標籤名稱需要在模型的attributeLabels()方法設定),通過{value}來引用當前屬性的輸入值,例如:

['username', 'unique', 'on' => 'register', 'message' => '{attribute}"{value}"已被佔用!', 'on' => 'signup']//註冊時使用者名稱唯一

yii驗證的使用方式有以下三種:

1. 用戶端驗證:

Yii預設開啟用戶端驗證,可以通過設定enableClientValidation參數為true開啟,開啟之後ActiveForm會讀模數型中申明的驗證規則產生相應的Javascript驗證代碼。enableClientValidation參數設定的方式有三種:

(1)在視圖檔案ActiveForm中對整個form進行設定:

<?php$form = ActiveForm::begin([  'enableClientValidation' =>true]);?>

(2)在視圖檔案ActiveField中對單個field進行設定:

複製代碼 代碼如下:

<?= $form->field($model, 'username', ['enableClientValidation'=>false])->label('使用者名稱') ?>

(3)在AR類的rules()函數中設定:
['username', 'yii\validators\StringValidator', 'min' => 3, 'max' => 30, 'enableClientValidation' => true, 'on' => 'register']

優先順序:(2)>(1)>(3)

2. 伺服器端驗證:

(1)validate()

模型validate()方法會根據rules()方法中定義的驗證規則對所有資料進行驗證,驗證通過返回true,否則將錯誤儲存在yii\base\Model::errors屬性中並返回false。

(2)save()

模型save()方法中預設調用validate()方法進行資料驗證,驗證通過則直接進行資料庫操作,返回true,否則不進行資料庫操作,返回false,將錯誤資訊儲存在yii\base\Model::errors屬性中。若已顯式調用過validate(),可以通過傳參避免在save()方法中重複驗證資料:save(false)。

3. Ajax驗證:

Yii預設關閉ajax驗證,可以通過配置enableAjaxValidation參數為true開啟。

用戶端設定(兩種方式):

(1)在視圖檔案ActiveForm中對整個form進行設定:

<?php$form = ActiveForm::begin([  'enableAjaxValidation' =>true]);?>

(2)在視圖檔案ActiveField中對單個field進行設定:

複製代碼 代碼如下:

<?= $form->field($model, 'username', ['enableAjaxValidation'=>false])->label('使用者名稱') ?>

優先順序:(2)>(1)

伺服器端處理:

if(Yii::$app->request->isAjax) {    $res = \yii\bootstrap\ActiveForm::validate($model);    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;    return $res;}

註:有些驗證規則無法使用用戶端驗證,如:unique、exist等。

三、yii核心驗證器

Yii提供了一些核心驗證器,可以直接使用,申明格式如下:

['屬性名稱', '驗證器名稱/類名', ...(一些額外參數設定)]

瞭解並使用yii的核心驗證器會讓開發變得簡單許多。下面簡單對yii核心驗證器進行分類介紹。

1. 不進行資料驗證的驗證器

(1)safe:而是把一個屬性標記為安全屬性。

['desc', 'safe']

(2)default:給值為空白的屬性設定預設值。

['add_time', 'default', 'value' => time()]

(3)trim:去除輸入值首尾兩側多餘空格。

['username', 'trim']

(4)filter:濾鏡,對資料進行格式化或一些其他處理後返回。

['phone', 'filter', 'filter' => function($value) {
....return $value;
}]

filter: 用於定義濾鏡的php回呼函數,可以為全域函數名,匿名函數或其他。
skipOnArray:是否在輸入為數組時跳過濾鏡,預設為false。如果濾鏡不能處理數組輸入,應該設定為true。

2. 資料類型驗證器

(1)boolean:布爾型。

['del', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]

trueValue:代表真的值,預設為1。
falseValue:代表假的值,預設為0。
strict:是否要求輸入資料必須嚴格匹配trueValue或falseValue。預設為false。

(2)number:數字。

['salary', 'number']

(3)double:雙精確度浮點型,等效於number驗證器。

['salary','double', 'max' => 99.99, 'min' => 0]

(4)integer:整數。

['age', 'integer']

註:number、double、integer驗證器都可以設定min、max參數來限制數位最大、最小值(含界點)。

(5)string:字串。

['username', 'string', 'length' => [3, 30]]

length:指定輸入字串的長度限制。
min:字串最小長度。
max:字串最大長度。
encoding:字串的編碼方式,不設定則使用應用自身的charset屬性值。預設為utf-8。

3. 資料格式驗證器

(1)date:日期。

['time', 'date', 'format' => 'php:Y:m:d', 'timestampAttribute' => 'startTime']

format:時間格式,預設為“y-m-d”。
timestampAttribute:將時間轉化為時間戳記並賦值給某個屬性。

(2)email:驗證是否符合郵箱地址格式。

['emailAddr', 'email']

(3)ip:驗證是否為有效IP地址。

['ip_address', 'ip']

(4)url:網址。

['website', 'url', 'defaultScheme' => 'http']

validSchemes:用於指定哪些URI方案會被視為有效,預設為['http', 'https']。
defaultScheme:若輸入值沒有對應的方案首碼,會使用的預設URI方案首碼。

(5)match:輸入值是否滿足某個Regex。

['username', 'match', 'pattern' => '/^[a-z]\w*$/i']

pattern:Regex。
not:是否對驗證結果取反。

4. 資料值驗證器

(1)required:必填。

[['username', 'password'], 'required']

requiredValue:所期望的值,若沒設定則輸入不可為空。
strict:檢查輸入值時是否檢查類型。

(2)captcha:驗證碼。

['verifyCode', 'captcha', 'caseSensitive' => true, 'captchaAction' => 'site/captcha', 'skipOnEmpty' => false]

caseSensitive:是否大小寫敏感,預設為false。
captchaAction:指向用於渲染驗證碼圖片的captcha方法的路由,預設為'site/captcha'。
skipOnEmpty:輸入為空白時是否跳過驗證,預設為false。

(3)compare:比較。

['password', 'compare', 'compareAttribute' => 'conpassword', 'operator' => '==']

compareAttribute:與指定屬性值比較的屬性名稱。
compareValue:與某個常量值比較。
operator:比較操作符。

其中compareAttribute預設在驗證屬性後面加尾碼“_repeat”作為另一個比較屬性的名稱,operator預設為“==”,即:['password', 'compare']規則表示驗證password與password_repeat的值是否相等。

(4)each:驗證數組。

['ids', 'each', 'rule' => ['integer']]

(驗證數組ids中的每個元素是否都是int類型資料)
rule:定義驗證每一個數組元素的驗證規則。
allowMessageFromRule:是否使用rule中指定的多個驗證規則報錯資訊,預設為true,若設定為false,則使用“message”參數值作為錯誤資訊。

註:若輸入值不是數組則會報錯。

(5)exist:存在性。

['cid', 'exist', 'targetClass' => 'app\models\Category', 'targetAttribute' => 'id']

(cid的值是否在AR類對應的id屬性中存在,使用情境:當前AR模型關聯的資料表的cid欄位和Category模型關聯的資料表的id欄位相關聯,所以使用該驗證規則驗證cid欄位的值能否在關聯的另一個資料表中找到對應記錄)
targetClass:用於尋找輸入值的目標AR類。
targetAttribute:用於尋找輸入值的目標屬性名稱。
filter:檢查屬性值存在性需要進行資料庫查詢,該參數設定查詢的過濾條件。可以設定為查詢條件的字串或數組,或者function($query)匿名函數。
allowArray:是否允許輸入值為數組,預設為false。若設定為true,則數組的每個元素都必須在目標欄位中存在。若把targetAttribute設定為多元素數組來驗證被測值在多欄位中的存在性時,該屬性不能設定為true。

(6)unique:唯一性。

['email', 'unique', 'targetClass' => 'app\models\User', 'message' => '{attribute}"{value}"已被註冊!', 'on' => 'signup']
除了沒有allowArray屬性,其他屬性都和exist驗證器一樣。

(7)in:範圍。

['sex', 'in', 'range' => [0, 1, 2]]

range:範圍值列表。
strict:是否使用strict 模式(類型與值都要相同)。
not:是否對驗證的結果取反,預設為false。
allowArray:是否接受輸入數組,預設為false。

5. 檔案驗證器

(1)file:檔案。

['pcImg', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024]

extensions:可接受上傳的副檔名列表。
mimeTypes:可接受上傳的MIME類型列表。
minSize:檔案大小下限。
maxSize:檔案大小上限。
maxFiles:上傳檔案個數上限,預設為1。設定為大於1時輸入值必須為數組。
checkExtensionByMimeType:是否通過檔案的MIME類型來判斷檔案擴充,預設為true。

(2)image:圖片。

['mbImg', 'image' extensions => 'png, ipg', 'minWidth' => 100, 'minHeight' => 100]

該驗證器繼承自file驗證器,並支援額外屬性minWidth、maxWidth、minHeight、maxHeight來設定圖片的最小、最大寬度和最小、最大高度。

四、其他驗證器

1. 條件式驗證:

['state', 'required', 'when' => function($model) {//只在country屬性值為'USA'的時候state屬性值才不可為空     return $model->country=='USA';}]

註:若需要支援用戶端驗證,則要配置'whenClient'屬性。

1. 自訂驗證器:

(1)行內驗證器:一種以模型方法或匿名函數的形式定義的驗證器。

樣本:

['conpassword', function($attribute, $params) {     if($this->$attribute != $this->newpassword) {        $this->addError($attribute, '確認密碼和新密碼不一致!');    }}]。

(當然這裡也可以使用yii核心驗證器'compare'來實現)

註:行內驗證器不支援用戶端驗證。

(2)獨立驗證器:

獨立驗證器是繼承自yii\validators\Validator或其子類的類,可以通過重寫validateAttribute()方法來實現驗證規則,若驗證失敗,可以調用yii\base\Model::addError()方法來儲存錯誤資訊到模型內。

獨立驗證器樣本:

namespace app\components;use yii\validators\Validator;class ConpasswordValidator extends Validator {     public function init() {         parent::init();         $this->message = '確認密碼和密碼不一致!';     }     //伺服器端驗證     public function validateAttribute($model, $attribute) {         if($model->conpassword !== $model->password) {              $model->addError($attribute, $this->message);         }     }     //用戶端驗證     public function clientValidateAttribute($model, $attribute, $view) {         $conpassword = json_encode($model->conpassword);         $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);     return <<<JSif(value != $conpassword) {     message.push($message);}JS;         return false;     }}

模型中使用樣本:

['conpassword', 'app\components\ConpasswordValidator']

最後要注意,驗證規則申明的先後順序對驗證結果也是有影響的!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.