首頁  >  文章  >  後端開發  >  Yii2框架資料驗證使用詳解

Yii2框架資料驗證使用詳解

php中世界最好的语言
php中世界最好的语言原創
2018-05-16 11:24:132103瀏覽

這次帶給大家Yii2框架資料驗證使用詳解,使用Yii2框架資料驗證的注意事項有哪些,以下就是實戰案例,一起來看一下。

一、場景

什麼情況下需要使用場景呢?當一個模型需要在不同情境中使用時,若不同情境下所需的資料表欄位和資料驗證規則有所不同,則需要定義多個場景來區分不同使用情境。例如,用戶註冊的時候需要填寫email,登入的時候則不需要,這時就需要定義兩個不同場景加以區分。

預設情況下模型的場景是由rules()方法申明的驗證規則中使用到的場景決定的,也可以透過覆寫scenarios()方法來更具體地定義模型的所有場景,例如:

public function scenarios() {
    return [
      'signup' => ['username', 'email', 'password', 'conpassword', 'verifyCode', 'reg_time', 'log_time'],
      'login' => ['username', 'password', 'verifyCode', 'rememberMe', 'log_time']
    ];
}

其中鍵為場景名稱,值為該場景下使用的模型屬性(稱為活動屬性)。

指定模型場景有以下兩種方法:

方法一:

$model = new User();
$model->scenario = 'signup';

方法二:

$model = new User(['scenario' => 'signup']);

可以透過指定驗證規則中的'on'屬性來申明一條驗證規則適用的場景:

['email', 'required', 'on' => 'signup']

場景主要用於模型屬性區塊賦值和資料驗證。呼叫模型類別的load()方法進行區塊賦值的時候,只有目前場景對應使用的屬性會被賦值,呼叫模型類別的validate()方法進行資料驗證的時候,只有當前場景屬性相關的且適用於當前場景的驗證規則會被執行。

二、驗證規則

Yii模型類別透過實作rules()方法申明所使用的所有驗證規則,範例:

public function rules() {
    return [
      [['username', 'password'], 'required'],
      ['email', 'email', 'on' => 'signup']
    ];
}

一條規則可適用於一個或多個場景,一條規則可用於驗證一個或多個屬性,一個屬性可對應一條或多條驗證規則。如果沒有指定'on'屬性,驗證規則會在所有場景下使用。

所有的驗證規則都可以透過設定'message'屬性來自訂錯誤訊息,而且在錯誤訊息內容中可以透過{attribute}來引用目前屬性標籤名稱(屬性標籤名稱需要在模型的attributeLabels( )方法設定),透過{value}來引用目前屬性的輸入值,例如:

['username', 'unique', 'on' => 'register', 'message' => '{attribute}"{value}"已被佔用! ', 'on' => 'signup']//註冊時用戶名唯一

yii驗證的使用方式有以下三種:

1. 客戶端驗證:

Yii預設開啟客戶端驗證,可以透過設定enableClientValidation參數為true開啟,開啟之後ActiveForm會讀取模型中申明的驗證規則產生對應的Javascript驗證程式碼。 enableClientValidation參數設定的方式有三種:

(1)在視圖檔ActiveForm中對整個form進行設定:

<?php
$form = ActiveForm::begin([
  &#39;enableClientValidation&#39; =>true
]);
?>

(2)在檢視檔ActiveField中對單一field進行設定:

<?= $form->field($model, &#39;username&#39;, [&#39;enableClientValidation&#39;=>false])->label(&#39;用户名&#39;) ?>

(3)在AR類別的rules()函數中設定:

#
[&#39;username&#39;, &#39;yii\validators\StringValidator&#39;, &#39;min&#39; => 3, &#39;max&#39; => 30, &#39;enableClientValidation&#39; => true, &#39;on&#39; => &#39;register&#39;]

優先權:(2)>(1)>( 3)

2. 伺服器端驗證:

(1)validate()

模型validate()方法會根據rules()方法中定義的驗證規則對所有資料進行驗證,驗證透過傳回true,否則將錯誤保存在yii\base\Model::errors屬性中並傳回false。

(2)save()

模型save()方法中預設呼叫validate()方法進行資料驗證,驗證通過則直接進行資料庫操作,傳回true,否則不進行資料庫操作,傳回false,將錯誤訊息儲存在yii\base\Model::errors屬性中。若已明確呼叫過validate(),可以透過傳參避免在save()方法中重複驗證資料:save(false)。

3. Ajax驗證:

Yii預設關閉ajax驗證,可以透過設定enableAjaxValidation參數為true開啟。

客户端设置(两种方式):

(1)在视图文件ActiveForm中对整个form进行设置:

<?php
$form = ActiveForm::begin([
  &#39;enableAjaxValidation&#39; =>true
]);
?>

(2)在视图文件ActiveField中对单个field进行设置:

<?= $form->field($model, &#39;username&#39;, [&#39;enableAjaxValidation&#39;=>false])->label(&#39;用户名&#39;) ?>

优先级:(2)>(1)

服务器端处理:

if(Yii::$app->request->isAjax) {
    $res = \yii\bootstrap\ActiveForm::validate($model);
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return $res;
}

注:有些验证规则无法使用客户端验证,如:unique、exist等。

三、yii核心验证器

Yii提供了一些核心验证器,可以直接使用,申明格式如下:

['属性名', '验证器名称/类名', ...(一些额外参数设置)]

了解并使用yii的核心验证器会让开发变得简单许多。下面简单对yii核心验证器进行分类介绍。

1. 不进行数据验证的验证器

(1)safe:而是把一个属性标记为安全属性。

[&#39;desc&#39;, &#39;safe&#39;]

(2)default:给值为空的属性设置默认值。

[&#39;add_time&#39;, &#39;default&#39;, &#39;value&#39; => time()]

(3)trim:去除输入值首尾两侧多余空格。

[&#39;username&#39;, &#39;trim&#39;]

(4)filter:滤镜,对数据进行格式化或一些其他处理后返回。

[&#39;phone&#39;, &#39;filter&#39;, &#39;filter&#39; => function($value) {
         ....return $value;
}]

filter: 用于定义滤镜的php回调函数,可以为全局函数名,匿名函数或其他。
skipOnArray:是否在输入为数组时跳过滤镜,默认为false。如果滤镜不能处理数组输入,应该设置为true。

2. 数据类型验证器

(1)boolean:布尔型。

[&#39;del&#39;, &#39;boolean&#39;, &#39;trueValue&#39; => true, &#39;falseValue&#39; => false, &#39;strict&#39; => true]

trueValue:代表真的值,默认为1。
falseValue:代表假的值,默认为0。
strict:是否要求输入数据必须严格匹配trueValue或falseValue。默认为false。

(2)number:数字。

[&#39;salary&#39;, &#39;number&#39;]

(3)double:双精度浮点型,等效于number验证器。

[&#39;salary&#39;,&#39;double&#39;, &#39;max&#39; => 99.99, &#39;min&#39; => 0]

(4)integer:整数。

[&#39;age&#39;, &#39;integer&#39;]

注:number、double、integer验证器都可以设置min、max参数来限制数字的最大、最小值(含界点)。

(5)string:字符串。

[&#39;username&#39;, &#39;string&#39;, &#39;length&#39; => [3, 30]]

length:指定输入字符串的长度限制。
min:字符串最小长度。
max:字符串最大长度。
encoding:字符串的编码方式,不设置则使用应用自身的charset属性值。默认为utf-8。

3. 数据格式验证器

(1)date:日期。

[&#39;time&#39;, &#39;date&#39;, &#39;format&#39; => &#39;php:Y:m:d&#39;, &#39;timestampAttribute&#39; => &#39;startTime&#39;]

format:时间格式,默认为“y-m-d”。
timestampAttribute:将时间转化为时间戳并赋值给某个属性。

(2)email:验证是否符合邮箱地址格式。

[&#39;emailAddr&#39;, &#39;email&#39;]

(3)ip:验证是否为有效IP地址。

[&#39;ip_address&#39;, &#39;ip&#39;]

(4)url:网址。

[&#39;website&#39;, &#39;url&#39;, &#39;defaultScheme&#39; => &#39;http&#39;]

validSchemes:用于指定哪些URI方案会被视为有效,默认为['http', 'https']。
defaultScheme:若输入值没有对应的方案前缀,会使用的默认URI方案前缀。

(5)match:输入值是否满足某个正则表达式

[&#39;username&#39;, &#39;match&#39;, &#39;pattern&#39; => &#39;/^[a-z]\w*$/i&#39;]

pattern:正则表达式。
not:是否对验证结果取反。

4. 数据值验证器

(1)required:必填。

[[&#39;username&#39;, &#39;password&#39;], &#39;required&#39;]

requiredValue:所期望的值,若没设置则输入不能为空。
strict:检查输入值时是否检查类型。

(2)captcha:验证码。

[&#39;verifyCode&#39;, &#39;captcha&#39;, &#39;caseSensitive&#39; => true, &#39;captchaAction&#39; => &#39;site/captcha&#39;, &#39;skipOnEmpty&#39; => false]

caseSensitive:是否大小写敏感,默认为false。
captchaAction:指向用于渲染验证码图片的captcha方法的路由,默认为'site/captcha'。
skipOnEmpty:输入为空时是否跳过验证,默认为false。

(3)compare:比较。

[&#39;password&#39;, &#39;compare&#39;, &#39;compareAttribute&#39; => &#39;conpassword&#39;, &#39;operator&#39; => &#39;==&#39;]

compareAttribute:与指定属性值比较的属性名称。
compareValue:与某个常量值比较。
operator:比较操作符。

其中compareAttribute默认在验证属性后面加后缀“_repeat”作为另一个比较属性的名称,operator默认为“==”,即:['password', 'compare']规则表示验证password与password_repeat的值是否相等。

(4)each:验证数组。

[&#39;ids&#39;, &#39;each&#39;, &#39;rule&#39; => [&#39;integer&#39;]]

(验证数组ids中的每个元素是否都是int类型数据)
rule:定义验证每一个数组元素的验证规则。
allowMessageFromRule:是否使用rule中指定的多个验证规则报错信息,默认为true,若设置为false,则使用“message”参数值作为错误信息。

注:若输入值不是数组则会报错

(5)exist:存在性。

[&#39;cid&#39;, &#39;exist&#39;, &#39;targetClass&#39; => &#39;app\models\Category&#39;, &#39;targetAttribute&#39; => &#39;id&#39;]

(cid的值是否在AR类对应的id属性中存在,使用场景:当前AR模型关联的数据表的cid字段和Category模型关联的数据表的id字段相关联,所以使用该验证规则验证cid字段的值能否在关联的另一个数据表中找到对应记录)
targetClass:用于查找输入值的目标AR类。
targetAttribute:用于查找输入值的目标属性名称。
filter:检查属性值存在性需要进行数据库查询,该参数设置查询的过滤条件。可以设置为查询条件的字符串或数组,或者function($query)匿名函数。
allowArray:是否允许输入值为数组,默认为false。若设置为true,则数组的每个元素都必须在目标字段中存在。若把targetAttribute设置为多元素数组来验证被测值在多字段中的存在性时,该属性不能设置为true。

(6)unique:唯一性。

[&#39;email&#39;, &#39;unique&#39;, &#39;targetClass&#39; => &#39;app\models\User&#39;, &#39;message&#39; => &#39;{attribute}"{value}"已被注册!&#39;, &#39;on&#39; => &#39;signup&#39;]

除了没有allowArray属性,其他属性都和exist验证器一样。

(7)in:范围。

[&#39;sex&#39;, &#39;in&#39;, &#39;range&#39; => [0, 1, 2]]

range:范围值列表。
strict:是否使用严格模式(类型与值都要相同)。
not:是否对验证的结果取反,默认为false。
allowArray:是否接受输入数组,默认为false。

5. 文件验证器

(1)file:文件。

[&#39;pcImg&#39;, &#39;file&#39;, &#39;extensions&#39; => [&#39;png&#39;, &#39;jpg&#39;, &#39;gif&#39;], &#39;maxSize&#39; => 1024*1024]

extensions:可接受上传的文件扩展名列表。
mimeTypes:可接受上传的MIME类型列表。
minSize:文件大小下限。
maxSize:文件大小上限。
maxFiles:上传文件个数上限,默认为1。设置为大于1时输入值必须为数组。
checkExtensionByMimeType:是否通过文件的MIME类型来判断文件扩展,默认为true。

(2)image:图片。

[&#39;mbImg&#39;, &#39;image&#39; extensions => &#39;png, ipg&#39;, &#39;minWidth&#39; => 100, &#39;minHeight&#39; => 100]

该验证器继承自file验证器,并支持额外属性minWidth、maxWidth、minHeight、maxHeight来设置图片的最小、最大宽度和最小、最大高度。

四、其他验证器

1. 条件式验证:

[&#39;state&#39;, &#39;required&#39;, &#39;when&#39; => function($model) {//只在country属性值为&#39;USA&#39;的时候state属性值才不能为空
     return $model->country==&#39;USA&#39;;
}]

注:若需要支持客户端验证,则要配置'whenClient'属性。

1. 自定义验证器:

(1)行内验证器:一种以模型方法或匿名函数的形式定义的验证器。

示例:

[&#39;conpassword&#39;, function($attribute, $params) {
     if($this->$attribute != $this->newpassword) {
        $this->addError($attribute, &#39;确认密码和新密码不一致!&#39;);
    }
}]。

(当然这里也可以使用yii核心验证器'compare'来实现)

注:行内验证器不支持客户端验证。

(2)独立验证器:

独立验证器是继承自yii\validators\Validator或其子类的类,可以通过重写validateAttribute()方法来实现验证规则,若验证失败,可以调用yii\base\Model::addError()方法来保存错误信息到模型内。

独立验证器示例:

namespace app\components;
use yii\validators\Validator;
class ConpasswordValidator extends Validator {
     public function init() {
         parent::init();
         $this->message = &#39;确认密码和密码不一致!&#39;;
     }
     //服务器端验证
     public function validateAttribute($model, $attribute) {
         if($model->conpassword !== $model->password) {
              $model->addError($attribute, $this->message);
         }
     }
     //客户端验证
     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;
     }
}

模型中使用示例:

[&#39;conpassword&#39;, &#39;app\components\ConpasswordValidator&#39;]

最后要注意,验证规则申明的先后顺序对验证结果也是有影响的!

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php使用curl仿制ip与refer步骤详解

php curl批次實作可控制並發非同步操作案例詳解

#

以上是Yii2框架資料驗證使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn