開發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位址
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,如需轉載請自行聯系原作者