搜尋
首頁後端開發php教程Yii2框架資料驗證使用詳解

這次帶給大家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
PHP中的PDO是什麼?PHP中的PDO是什麼?Apr 28, 2025 pm 04:51 PM

本文討論了PHP數據對象(PDO),這是PHP中數據庫訪問的擴展名。它通過準備好的語句及其對MySQLI的好處,包括數據庫抽象和更好的錯誤處理,強調了PDO在增強安全性方面的作用。

php中的memcache是​​什麼?是否可以在幾個PHP項目之間共享一個memcache的一個實例?php中的memcache是​​什麼?是否可以在幾個PHP項目之間共享一個memcache的一個實例?Apr 28, 2025 pm 04:47 PM

memcache和memcached是通過減少數據庫負載加快Web應用程序的PHP緩存系統。可以在仔細的密鑰管理的項目之間共享一個實例。

使用MySQL和PHP創建新數據庫的步驟是什麼?使用MySQL和PHP創建新數據庫的步驟是什麼?Apr 28, 2025 pm 04:44 PM

文章討論了使用PHP創建和管理MySQL數據庫的步驟,專注於連接,創建,常見錯誤和安全措施。

JavaScript是否與PHP相互作用?JavaScript是否與PHP相互作用?Apr 28, 2025 pm 04:43 PM

本文討論了JavaScript和PHP如何通過HTTP請求間接相互作用,因為它們的環境不同。它涵蓋了將數據從JavaScript發送到PHP的方法

PHP中的梨是什麼?PHP中的梨是什麼?Apr 28, 2025 pm 04:38 PM

梨是可重複使用組件的PHP框架,通過包裝管理,編碼標準和社區支持增強開發。

PHP的用途是什麼?PHP的用途是什麼?Apr 28, 2025 pm 04:37 PM

PHP是一種多功能的腳本語言,主要用於Web開發,創建動態頁面,還可以用於命令行腳本,桌面應用程序和API開發。

PHP的舊名稱是什麼?PHP的舊名稱是什麼?Apr 28, 2025 pm 04:36 PM

文章討論了PHP從1995年的“個人主頁工具”到1998年的“ PHP:超文本預處理器”的演變,這反映了其超越個人網站的擴展使用。

如何防止會話固定攻擊?如何防止會話固定攻擊?Apr 28, 2025 am 12:25 AM

防止會話固定攻擊的有效方法包括:1.在用戶登錄後重新生成會話ID;2.使用安全的會話ID生成算法;3.實施會話超時機制;4.使用HTTPS加密會話數據,這些措施能確保應用在面對會話固定攻擊時堅不可摧。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中