本文實(shí)例講述了Yii2框架數(shù)據(jù)驗(yàn)證操作。分享給大家供大家參考,具體如下:
一、場景
什么情況下需要使用場景呢?當(dāng)一個(gè)模型需要在不同情境中使用時(shí),若不同情境下需要的數(shù)據(jù)表字段和數(shù)據(jù)驗(yàn)證規(guī)則有所不同,則需要定義多個(gè)場景來區(qū)分不同使用情境。例如,用戶注冊(cè)的時(shí)候需要填寫email,登錄的時(shí)候則不需要,這時(shí)就需要定義兩個(gè)不同場景加以區(qū)分。
默認(rèn)情況下模型的場景是由rules()
方法申明的驗(yàn)證規(guī)則中使用到的場景決定的,也可以通過覆蓋scenarios()
方法來更具體地定義模型的所有場景,例如:
public function scenarios() {
return [
'signup' => ['username', 'email', 'password', 'conpassword', 'verifyCode', 'reg_time', 'log_time'],
'login' => ['username', 'password', 'verifyCode', 'rememberMe', 'log_time']
];
}
其中鍵為場景名稱,值為該場景下使用的模型屬性(稱為活動(dòng)屬性)。
指定模型場景有以下兩種方法:
方法一:
$model = new User();
$model->scenario = 'signup';
方法二:
$model = new User(['scenario' => 'signup']);
可以通過指定驗(yàn)證規(guī)則中的'on'屬性來申明一條驗(yàn)證規(guī)則適用的場景:
['email', 'required', 'on' => 'signup']
場景主要用于模型屬性塊賦值和數(shù)據(jù)驗(yàn)證。調(diào)用模型類的load()
方法進(jìn)行塊賦值的時(shí)候,只有當(dāng)前場景對(duì)應(yīng)使用的屬性會(huì)被賦值,調(diào)用模型類的validate()
方法進(jìn)行數(shù)據(jù)驗(yàn)證的時(shí)候,只有當(dāng)前場景屬性相關(guān)的且適用于當(dāng)前場景的驗(yàn)證規(guī)則會(huì)被執(zhí)行。
二、驗(yàn)證規(guī)則
Yii模型類通過實(shí)現(xiàn)rules()方法申明使用的所有驗(yàn)證規(guī)則,示例:
public function rules() {
return [
[['username', 'password'], 'required'],
['email', 'email', 'on' => 'signup']
];
}
一條規(guī)則可適用于一個(gè)或多個(gè)場景,一條規(guī)則可用來驗(yàn)證一個(gè)或多個(gè)屬性,一個(gè)屬性可對(duì)應(yīng)一條或多條驗(yàn)證規(guī)則。如果沒有指定'on'屬性,驗(yàn)證規(guī)則會(huì)在所有場景下使用。
所有的驗(yàn)證規(guī)則都可以通過設(shè)置'message'屬性來自定義錯(cuò)誤信息,而且在錯(cuò)誤信息內(nèi)容中可以通過{attribute}來引用當(dāng)前屬性標(biāo)簽名稱(屬性標(biāo)簽名稱需要在模型的attributeLabels()方法設(shè)置),通過{value}來引用當(dāng)前屬性的輸入值,例如:
['username', 'unique', 'on' => 'register', 'message' => '{attribute}"{value}"已被占用!', 'on' => 'signup']//注冊(cè)時(shí)用戶名唯一
yii驗(yàn)證的使用方式有以下三種:
1. 客戶端驗(yàn)證:
Yii默認(rèn)開啟客戶端驗(yàn)證,可以通過設(shè)置enableClientValidation參數(shù)為true開啟,開啟之后ActiveForm會(huì)讀取模型中申明的驗(yàn)證規(guī)則生成相應(yīng)的Javascript驗(yàn)證代碼。enableClientValidation參數(shù)設(shè)置的方式有三種:
(1)在視圖文件ActiveForm中對(duì)整個(gè)form進(jìn)行設(shè)置:
?php
$form = ActiveForm::begin([
'enableClientValidation' =>true
]);
?>
(2)在視圖文件ActiveField中對(duì)單個(gè)field進(jìn)行設(shè)置:
復(fù)制代碼 代碼如下:
?= $form->field($model, 'username', ['enableClientValidation'=>false])->label('用戶名') ?>
(3)在AR類的rules()函數(shù)中設(shè)置:
['username', 'yii\validators\StringValidator', 'min' => 3, 'max' => 30, 'enableClientValidation' => true, 'on' => 'register']
優(yōu)先級(jí):(2)>(1)>(3)
2. 服務(wù)器端驗(yàn)證:
(1)validate()
模型validate()
方法會(huì)根據(jù)rules()方法中定義的驗(yàn)證規(guī)則對(duì)所有數(shù)據(jù)進(jìn)行驗(yàn)證,驗(yàn)證通過返回true,否則將錯(cuò)誤保存在yii\base\Model::errors屬性中并返回false。
(2)save()
模型save()
方法中默認(rèn)調(diào)用validate()
方法進(jìn)行數(shù)據(jù)驗(yàn)證,驗(yàn)證通過則直接進(jìn)行數(shù)據(jù)庫操作,返回true,否則不進(jìn)行數(shù)據(jù)庫操作,返回false,將錯(cuò)誤信息存儲(chǔ)在yii\base\Model::errors屬性中。若已顯式調(diào)用過validate(),可以通過傳參避免在save()方法中重復(fù)驗(yàn)證數(shù)據(jù):save(false)。
3. Ajax驗(yàn)證:
Yii默認(rèn)關(guān)閉ajax驗(yàn)證,可以通過配置enableAjaxValidation參數(shù)為true開啟。
客戶端設(shè)置(兩種方式):
(1)在視圖文件ActiveForm中對(duì)整個(gè)form進(jìn)行設(shè)置:
?php
$form = ActiveForm::begin([
'enableAjaxValidation' =>true
]);
?>
(2)在視圖文件ActiveField中對(duì)單個(gè)field進(jìn)行設(shè)置:
復(fù)制代碼 代碼如下:
?= $form->field($model, 'username', ['enableAjaxValidation'=>false])->label('用戶名') ?>
優(yōu)先級(jí):(2)>(1)
服務(wù)器端處理:
if(Yii::$app->request->isAjax) {
$res = \yii\bootstrap\ActiveForm::validate($model);
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return $res;
}
注:有些驗(yàn)證規(guī)則無法使用客戶端驗(yàn)證,如:unique、exist等。
三、yii核心驗(yàn)證器
Yii提供了一些核心驗(yàn)證器,可以直接使用,申明格式如下:
['屬性名', '驗(yàn)證器名稱/類名', ...(一些額外參數(shù)設(shè)置)]
了解并使用yii的核心驗(yàn)證器會(huì)讓開發(fā)變得簡單許多。下面簡單對(duì)yii核心驗(yàn)證器進(jìn)行分類介紹。
1. 不進(jìn)行數(shù)據(jù)驗(yàn)證的驗(yàn)證器
(1)safe:而是把一個(gè)屬性標(biāo)記為安全屬性。
['desc', 'safe']
(2)default:給值為空的屬性設(shè)置默認(rèn)值。
['add_time', 'default', 'value' => time()]
(3)trim:去除輸入值首尾兩側(cè)多余空格。
['username', 'trim']
(4)filter:濾鏡,對(duì)數(shù)據(jù)進(jìn)行格式化或一些其他處理后返回。
['phone', 'filter', 'filter' => function($value) {
....return $value;
}]
filter: 用于定義濾鏡的php回調(diào)函數(shù),可以為全局函數(shù)名,匿名函數(shù)或其他。
skipOnArray:是否在輸入為數(shù)組時(shí)跳過濾鏡,默認(rèn)為false。如果濾鏡不能處理數(shù)組輸入,應(yīng)該設(shè)置為true。
2. 數(shù)據(jù)類型驗(yàn)證器
(1)boolean:布爾型。
['del', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]
trueValue:代表真的值,默認(rèn)為1。
falseValue:代表假的值,默認(rèn)為0。
strict:是否要求輸入數(shù)據(jù)必須嚴(yán)格匹配trueValue或falseValue。默認(rèn)為false。
(2)number:數(shù)字。
['salary', 'number']
(3)double:雙精度浮點(diǎn)型,等效于number驗(yàn)證器。
['salary','double', 'max' => 99.99, 'min' => 0]
(4)integer:整數(shù)。
['age', 'integer']
注:number、double、integer驗(yàn)證器都可以設(shè)置min、max參數(shù)來限制數(shù)字的最大、最小值(含界點(diǎn))。
(5)string:字符串。
['username', 'string', 'length' => [3, 30]]
length:指定輸入字符串的長度限制。
min:字符串最小長度。
max:字符串最大長度。
encoding:字符串的編碼方式,不設(shè)置則使用應(yīng)用自身的charset屬性值。默認(rèn)為utf-8。
3. 數(shù)據(jù)格式驗(yàn)證器
(1)date:日期。
['time', 'date', 'format' => 'php:Y:m:d', 'timestampAttribute' => 'startTime']
format:時(shí)間格式,默認(rèn)為“y-m-d”。
timestampAttribute:將時(shí)間轉(zhuǎn)化為時(shí)間戳并賦值給某個(gè)屬性。
(2)email:驗(yàn)證是否符合郵箱地址格式。
['emailAddr', 'email']
(3)ip:驗(yàn)證是否為有效IP地址。
['ip_address', 'ip']
(4)url:網(wǎng)址。
['website', 'url', 'defaultScheme' => 'http']
validSchemes:用于指定哪些URI方案會(huì)被視為有效,默認(rèn)為['http', 'https']。
defaultScheme:若輸入值沒有對(duì)應(yīng)的方案前綴,會(huì)使用的默認(rèn)URI方案前綴。
(5)match:輸入值是否滿足某個(gè)正則表達(dá)式。
['username', 'match', 'pattern' => '/^[a-z]\w*$/i']
pattern:正則表達(dá)式。
not:是否對(duì)驗(yàn)證結(jié)果取反。
4. 數(shù)據(jù)值驗(yàn)證器
(1)required:必填。
[['username', 'password'], 'required']
requiredValue:所期望的值,若沒設(shè)置則輸入不能為空。
strict:檢查輸入值時(shí)是否檢查類型。
(2)captcha:驗(yàn)證碼。
['verifyCode', 'captcha', 'caseSensitive' => true, 'captchaAction' => 'site/captcha', 'skipOnEmpty' => false]
caseSensitive:是否大小寫敏感,默認(rèn)為false。
captchaAction:指向用于渲染驗(yàn)證碼圖片的captcha方法的路由,默認(rèn)為'site/captcha'。
skipOnEmpty:輸入為空時(shí)是否跳過驗(yàn)證,默認(rèn)為false。
(3)compare:比較。
['password', 'compare', 'compareAttribute' => 'conpassword', 'operator' => '==']
compareAttribute:與指定屬性值比較的屬性名稱。
compareValue:與某個(gè)常量值比較。
operator:比較操作符。
其中compareAttribute默認(rèn)在驗(yàn)證屬性后面加后綴“_repeat”作為另一個(gè)比較屬性的名稱,operator默認(rèn)為“==”,即:['password', 'compare']規(guī)則表示驗(yàn)證password與password_repeat的值是否相等。
(4)each:驗(yàn)證數(shù)組。
['ids', 'each', 'rule' => ['integer']]
(驗(yàn)證數(shù)組ids中的每個(gè)元素是否都是int類型數(shù)據(jù))
rule:定義驗(yàn)證每一個(gè)數(shù)組元素的驗(yàn)證規(guī)則。
allowMessageFromRule:是否使用rule中指定的多個(gè)驗(yàn)證規(guī)則報(bào)錯(cuò)信息,默認(rèn)為true,若設(shè)置為false,則使用“message”參數(shù)值作為錯(cuò)誤信息。
注:若輸入值不是數(shù)組則會(huì)報(bào)錯(cuò)。
(5)exist:存在性。
['cid', 'exist', 'targetClass' => 'app\models\Category', 'targetAttribute' => 'id']
(cid的值是否在AR類對(duì)應(yīng)的id屬性中存在,使用場景:當(dāng)前AR模型關(guān)聯(lián)的數(shù)據(jù)表的cid字段和Category模型關(guān)聯(lián)的數(shù)據(jù)表的id字段相關(guān)聯(lián),所以使用該驗(yàn)證規(guī)則驗(yàn)證cid字段的值能否在關(guān)聯(lián)的另一個(gè)數(shù)據(jù)表中找到對(duì)應(yīng)記錄)
targetClass:用于查找輸入值的目標(biāo)AR類。
targetAttribute:用于查找輸入值的目標(biāo)屬性名稱。
filter:檢查屬性值存在性需要進(jìn)行數(shù)據(jù)庫查詢,該參數(shù)設(shè)置查詢的過濾條件??梢栽O(shè)置為查詢條件的字符串或數(shù)組,或者function($query)匿名函數(shù)。
allowArray:是否允許輸入值為數(shù)組,默認(rèn)為false。若設(shè)置為true,則數(shù)組的每個(gè)元素都必須在目標(biāo)字段中存在。若把targetAttribute設(shè)置為多元素?cái)?shù)組來驗(yàn)證被測值在多字段中的存在性時(shí),該屬性不能設(shè)置為true。
(6)unique:唯一性。
['email', 'unique', 'targetClass' => 'app\models\User', 'message' => '{attribute}"{value}"已被注冊(cè)!', 'on' => 'signup']
除了沒有allowArray屬性,其他屬性都和exist驗(yàn)證器一樣。
(7)in:范圍。
['sex', 'in', 'range' => [0, 1, 2]]
range:范圍值列表。
strict:是否使用嚴(yán)格模式(類型與值都要相同)。
not:是否對(duì)驗(yàn)證的結(jié)果取反,默認(rèn)為false。
allowArray:是否接受輸入數(shù)組,默認(rèn)為false。
5. 文件驗(yàn)證器
(1)file:文件。
['pcImg', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024]
extensions:可接受上傳的文件擴(kuò)展名列表。
mimeTypes:可接受上傳的MIME類型列表。
minSize:文件大小下限。
maxSize:文件大小上限。
maxFiles:上傳文件個(gè)數(shù)上限,默認(rèn)為1。設(shè)置為大于1時(shí)輸入值必須為數(shù)組。
checkExtensionByMimeType:是否通過文件的MIME類型來判斷文件擴(kuò)展,默認(rèn)為true。
(2)image:圖片。
['mbImg', 'image' extensions => 'png, ipg', 'minWidth' => 100, 'minHeight' => 100]
該驗(yàn)證器繼承自file驗(yàn)證器,并支持額外屬性minWidth、maxWidth、minHeight、maxHeight來設(shè)置圖片的最小、最大寬度和最小、最大高度。
四、其他驗(yàn)證器
1. 條件式驗(yàn)證:
['state', 'required', 'when' => function($model) {//只在country屬性值為'USA'的時(shí)候state屬性值才不能為空
return $model->country=='USA';
}]
注:若需要支持客戶端驗(yàn)證,則要配置'whenClient'屬性。
1. 自定義驗(yàn)證器:
(1)行內(nèi)驗(yàn)證器:一種以模型方法或匿名函數(shù)的形式定義的驗(yàn)證器。
示例:
['conpassword', function($attribute, $params) {
if($this->$attribute != $this->newpassword) {
$this->addError($attribute, '確認(rèn)密碼和新密碼不一致!');
}
}]。
(當(dāng)然這里也可以使用yii核心驗(yàn)證器'compare'來實(shí)現(xiàn))
注:行內(nèi)驗(yàn)證器不支持客戶端驗(yàn)證。
(2)獨(dú)立驗(yàn)證器:
獨(dú)立驗(yàn)證器是繼承自yii\validators\Validator或其子類的類,可以通過重寫validateAttribute()
方法來實(shí)現(xiàn)驗(yàn)證規(guī)則,若驗(yàn)證失敗,可以調(diào)用yii\base\Model::addError()
方法來保存錯(cuò)誤信息到模型內(nèi)。
獨(dú)立驗(yàn)證器示例:
namespace app\components;
use yii\validators\Validator;
class ConpasswordValidator extends Validator {
public function init() {
parent::init();
$this->message = '確認(rèn)密碼和密碼不一致!';
}
//服務(wù)器端驗(yàn)證
public function validateAttribute($model, $attribute) {
if($model->conpassword !== $model->password) {
$model->addError($attribute, $this->message);
}
}
//客戶端驗(yàn)證
public function clientValidateAttribute($model, $attribute, $view) {
$conpassword = json_encode($model->conpassword);
$message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
return JS
if(value != $conpassword) {
message.push($message);
}
JS;
return false;
}
}
模型中使用示例:
['conpassword', 'app\components\ConpasswordValidator']
最后要注意,驗(yàn)證規(guī)則申明的先后順序?qū)︱?yàn)證結(jié)果也是有影響的!
更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- Yii基于CActiveForm的Ajax數(shù)據(jù)驗(yàn)證用法示例
- Yii框架數(shù)據(jù)模型的驗(yàn)證規(guī)則rules()被執(zhí)行的方法
- Yii數(shù)據(jù)模型中rules類驗(yàn)證器用法分析
- yii2中的rules 自定義驗(yàn)證規(guī)則詳解
- 在yii中新增一個(gè)用戶驗(yàn)證的方法詳解
- PHP YII框架開發(fā)小技巧之模型(models)中rules自定義驗(yàn)證規(guī)則
- Yii使用Captcha驗(yàn)證碼的方法
- yii2 modal彈窗之ActiveForm ajax表單異步驗(yàn)證
- PHP Yii框架之表單驗(yàn)證規(guī)則大全
- Yii2驗(yàn)證器(Validator)用法分析
- 詳解Yii2 rules 的驗(yàn)證規(guī)則