教你三種Model(AR)中自定義驗證規則的方法

各位Yii2兄弟都知道Model的rules裏面可以使用自己定義的驗證規則,我們今天就把自定義規則做一個總結,進行一次徹底的知識歸納。

和以往一樣,先列目錄。

  1. 匿名函數形式
  2. 類的公共方法形式
  3. 自己建立驗證類形式

提前準備

在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一樣,照着做就可以了。

這就是三種自定義驗證規則的方法,希望對大家有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章