天天看點

Yii 2 —— 字段校驗

開發Web應用有一個很重要的原則,就是不要相信任何輸入的資料,在使用之前必須要進行有效性檢查,否則很有可能會引發各種安全性問題。Yii 2當然也不會忽略這個問題,提供了校驗器這一有力的工具,該工具可同時提供用戶端和伺服器端的資料校驗。

在Model内,重載rules()接口,配置每個字段的規則,如下(以LoginForm為例):

public function rules()

 {

     return [

         // username and password are both required

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

         // rememberMe must be a boolean value

         ['rememberMe', 'boolean'],

         // password is validated by validatePassword()

         ['password', 'validatePassword'],

     ];

 }

每一行中,前面是字段名稱,最後一個元素是規則的名稱。這些規則最終是通過“校驗器”來完成校驗的。當然内置的校驗器肯定不能夠全部滿足需求,是以Yii 2在根據規則名稱建立校驗器的時候,會首先檢查該Model中是否有跟規則名稱相同的函數,如果有,則校驗規則的時候就直接用該函數來完成校驗,譬如上面代碼中的“validatePassword”規則,在LoginForm中就有接口:

public function validatePassword($attribute, $params)

     if (!$this->hasErrors()) {

         $user = $this->getUser();

         if (!$user || !$user->validatePassword($this->password)) {

             $this->addError($attribute, '賬号或密碼輸入錯誤。');

         }

     }

Yii 2中,校驗器存放于vendor\yiisoft\yii2\validators目錄下,有如下内置校驗器(這些校驗器沒有全部都用過,這裡列出來功能,細節待用到的時候再研究):

boolean

檢測輸入值是否為boolean類型

captcha

檢測輸入的校驗碼是否正确,這個需要與yii\captcha\CaptchaAction一起使用

compare

與指定值進行比較,确認兩者是否符合比較條件(如:>=、=、<=),譬如注冊時會要求輸入兩次密碼,要比較這兩次輸入的密碼是否相同

date

檢測輸入值是否為date類型

datetime

檢測輸入值是否為datetime類型

time

檢測輸入值是否為time類型

default

這個實際上不是一個校驗器,是當某個屬性為空時,提供預設值用的

double

檢測輸入值是否為double類型

each

對輸入的一組資料進行校驗

email

檢測輸入值是否為email位址

exist

判斷輸入的值是否在資料庫中存在,常用于檢查某個值在外鍵中是否存在

file

檢測輸入值是否為檔案

filter

将輸入值轉換為另一個值,它實際上不是個校驗器。

image

檢測輸入值是否為圖檔

in

檢測輸入值是否在指定的清單中

integer

檢測輸入值是否為integer類型

match

使用正規表達式檢查輸入值

required

檢測輸入值是否為空

safe

标志輸入的字段是否可信,Yii對Model的每個字段都要求必須要有校驗器,但是有時候有些字段的确不需要,譬如主鍵ID。

string

檢測輸入值是否為string類型

trim

這實際上是一個轉換器,去除掉輸入的前後空格

unique

檢測輸入值在表中是否唯一

url

檢測輸入值是否為URL

ip

檢測輸入值是否為IP位址

參考文獻:

建立一個檔案:

?php

namespace common\helps;

use yii\validators\Validator;

class ArrayValidator extends Validator

{

    publicfunction validateAttribute($model, $attribute)

    {

        if (!is_array($model->$attribute)) {

            $this->addError($model, $attribute, $attribute . '必須是一個數組');

        }

    }

}

<a>                            </a>

使用的時候:

<a></a>

publicfunction rules()

    return [

        ...

        ['kind_ids','common\helps\ArrayValidator'], // 自定義驗證

    ];

本文轉自 tywali 51CTO部落格,原文連結:http://blog.51cto.com/lancelot/1875616,如需轉載請自行聯系原作者