各位Yii2兄弟都知道Model的rules裏面可以使用自己定義的驗證規則,我們今天就把自定義規則做一個總結,進行一次徹底的知識歸納。
和以往一樣,先列目錄。
- 匿名函數形式
- 類的公共方法形式
- 自己建立驗證類形式
提前準備
在User模型(User.php)裏,我們想對一個字段username進行自定義驗證,當username的值爲abei的時候通過,否則提示“不是abei,不能通過。”
匿名函數形式
public function rules(){
return [
["username",function($attr,$params){
if($this->$attr == 'abei'){
return true;
}else{
$this->addError("username","不是abei,不能通過。");
}
}],
];
}
我想你看明白了吧,很簡單,直接將驗證的邏輯寫到一個匿名函數中和username對應上即可。這裏的關鍵詞是**$this->addError**,要記住。$attr代表當前被驗證的字段,即username.
go on.
類的公共方法
public function rules(){
return [
["username","checkAbei"],
];
}
public function checkAbei($attr,$params){
if($this->$attr == 'abei'){
return true;
}else{
$this->addError("username","不是abei,不能通過。");
}
}
這個也很好理解,換湯不換藥,僅僅是將匿名函數提取出來了,記住在rules函數內,自定義驗證規則的名字和實現驗證的方法名字必須一致。
這兩個方法都很簡單,也很方便,但是~,缺點也是明顯的,就是隻能供給User模型使用。
在我們這樣一個和諧且統一的國度裏,這種情況是不提倡的,於是乎,出現了第三種方法
自定義驗證類
我們可以建立一個自定義的驗證類,然後供各種Model使用。那麼開始吧。
首先,需要在components下面新建一個驗證類,我們起名爲CheckAbeiValidator。什麼?沒有components?暈,那就新建一個文件夾就好了嘛。
CheckAbeiValidator.php
namespace app\components;
use yii\validators\Validator;
class CheckAbeiValidator extends Validator {
public function validateAttribute($model, $attribute) {
if($model->$attribute == 'abei'){
return true;
}else{
$this->addError($model,$attribute,"不是abei,不能通過。");
}
}
}
你看到了麼?CheckAbeiValidator繼承於Validator,對Validator的validateAttribute進行重載,和上面兩種方法基本一樣,不同的是多了一個Model,這也對的,畢竟我是公共的,你總要告訴我是誰在讓我驗證,我需要告訴誰結果吧。
好,驗證類好了,如何使用那?
現在我們回到User模型(User.php)
use app\components\CheckAbeiValidator;
首先我們需要使用這個類,use一下。然後....
public function rules(){
return [
["username",CheckAbeiValidator::className()],
];
}
ok,這就是完事了,我們通過rules告訴username使用CheckAbeiValidator類來驗證。
其他的模型如果想驗證,也是和User一樣,照着做就可以了。
這就是三種自定義驗證規則的方法,希望對大家有幫助。