Yii2 프레임워크 데이터 검증 작업 예시에 대한 자세한 설명

不言
풀어 주다: 2023-03-25 09:52:01
원래의
1842명이 탐색했습니다.

이 글은 주로 Yii2 프레임워크의 데이터 검증 작업을 소개하며, Yii 프레임워크의 일반적인 데이터 검증 작업의 원리, 구현 방법 및 관련 작업 기법을 예제 형식으로 자세히 분석합니다.

이 문서에서는 Yii2 프레임워크 데이터를 예제와 함께 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

1. 시나리오

어떤 상황에서 시나리오를 사용해야 하나요? 모델을 다양한 시나리오에서 사용해야 하는 경우, 다양한 시나리오에 필요한 데이터 테이블 필드와 데이터 유효성 검사 규칙이 다른 경우 다양한 사용 시나리오를 구별하기 위해 여러 시나리오를 정의해야 합니다. 예를 들어, 사용자는 등록할 때 이메일을 입력해야 하지만 로그인할 때는 입력하지 않아야 합니다. 이 경우 이를 구별하기 위해 두 가지 시나리오를 정의해야 합니다.

기본적으로 모델 시나리오는 rules() 메서드에서 선언한 확인 규칙에 사용된 시나리오에 따라 결정됩니다. scenarios()를 재정의하여 변경할 수도 있습니다. > 방법을 사용하여 모델의 모든 장면을 구체적으로 정의합니다. 예: 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()函数中设置:
['username', 'yiivalidatorsStringValidator', 'min' => 3, 'max' => 30, 'enableClientValidation' => true, 'on' => 'register']

优先级:(2)>(1)>(3)

2. 服务器端验证:

(1)validate()

模型validate()方法会根据rules()方法中定义的验证规则对所有数据进行验证,验证通过返回true,否则将错误保存在yiibaseModel::errors属性中并返回false。

(2)save()

模型save()方法中默认调用validate()

<?php
$form = ActiveForm::begin([
  &#39;enableAjaxValidation&#39; =>true
]);
?>
로그인 후 복사

여기서 키는 장면 이름이고 값은 장면에 사용되는 모델 속성(활동 속성이라고 함)입니다.

모델 장면을 지정하는 방법에는 두 가지가 있습니다.

방법 1:

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


방법 2: 🎜🎜🎜🎜
if(Yii::$app->request->isAjax) {
    $res = \yii\bootstrap\ActiveForm::validate($model);
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return $res;
}
로그인 후 복사
로그인 후 복사
🎜🎜🎜은 'on' 속성을 지정하여 선언할 수 있습니다. 에서 검증 규칙 검증 규칙이 적용되는 시나리오: 🎜🎜🎜
[&#39;state&#39;, &#39;required&#39;, &#39;when&#39; => function($model) {//只在country属性值为&#39;USA&#39;的时候state属性值才不能为空
     return $model->country==&#39;USA&#39;;
}]
로그인 후 복사
로그인 후 복사
🎜🎜🎜이 시나리오는 주로 모델 속성 블록 할당 및 데이터 검증에 사용됩니다. 블록 할당을 위해 모델 클래스의 load() 메서드를 호출하면 현재 장면에 해당하는 속성만 할당됩니다. 모델의 validate() 메서드를 호출합니다. 데이터 검증을 위한 클래스에서는 현재 장면 속성과 관련되고 현재 장면에 적용 가능한 유효성 검사 규칙만 실행됩니다. 🎜🎜🎜🎜2. 유효성 검사 규칙🎜🎜🎜🎜Yii 모델 클래스는 rule() 메서드를 구현하여 사용되는 모든 유효성 검사 규칙을 선언합니다. 예: 🎜🎜🎜
[&#39;conpassword&#39;, function($attribute, $params) {
     if($this->$attribute != $this->newpassword) {
        $this->addError($attribute, &#39;确认密码和新密码不一致!&#39;);
    }
}]。
로그인 후 복사
로그인 후 복사
🎜🎜🎜규칙은 하나 이상의 시나리오에 적용될 수 있습니다. 하나의 규칙은 하나 이상의 속성을 확인하는 데 사용될 수 있으며, 하나의 속성은 하나 이상의 확인 규칙에 해당할 수 있습니다. 'on' 속성을 지정하지 않으면 모든 시나리오에서 유효성 검사 규칙이 사용됩니다. 🎜🎜모든 유효성 검사 규칙은 'message' 속성을 설정하여 오류 메시지를 맞춤 설정할 수 있으며, 현재 속성 라벨 이름은 오류 메시지 내용의 {attribute}를 통해 참조할 수 있습니다(속성 라벨 이름은 attributeLabels()에서 설정해야 함) 모델의 메소드) , {value}를 통해 현재 속성의 입력 값을 참조합니다. 예: 🎜🎜['username', 'unique', 'on' => ; '등록', '메시지' => '{속성}"{값}"이(가) 이미 사용 중입니다! ', 'on' => 'signup']//등록 시 사용자 이름은 고유합니다. yii 확인을 사용하는 방법에는 세 가지가 있습니다. 🎜🎜🎜1 클라이언트 확인: 🎜🎜🎜Yii는 기본적으로 클라이언트 확인을 활성화합니다. 활성화한 후 ActiveForm은 모델에 선언된 유효성 검사 규칙을 읽고 해당 Javascript 확인 ​​코드를 생성합니다. 활성화ClientValidation 매개변수를 설정하는 방법에는 세 가지가 있습니다. 🎜🎜 (1) 보기 파일 ActiveForm에서 전체 양식 설정: 🎜🎜🎜
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;
     }
}
로그인 후 복사
로그인 후 복사
🎜🎜🎜 (2) 보기 파일 ActiveField에서 단일 필드 설정: 🎜🎜

코드 복사 🎜 코드는 다음과 같습니다. 🎜rrreee🎜 (3) AR 클래스의 rule() 함수에 설정: 🎜['username', 'yiivalidatorsStringValidator', 'min' => 3, 'max' => 30, 'enableClientValidation' => ]🎜🎜🎜우선순위 수준: (2)>(1)>(3)🎜🎜🎜2. 서버 측 확인: 🎜🎜🎜(1) verify()🎜🎜모델 validate()< /code> 메소드는 규칙을 기반으로 합니다. () 메소드에 정의된 유효성 검사 규칙은 모든 데이터를 확인하고, 확인에 통과하면 true를 반환합니다. 그렇지 않으면 오류는 <span style="color: #0000ff">yiibaseModel에 저장됩니다. ::errors🎜 속성과 false가 반환됩니다. 🎜🎜(2) save()🎜🎜모델 <code>save() 메서드는 데이터 확인을 위해 기본적으로 validate() 메서드를 호출합니다. 직접 수행되고 true가 반환됩니다. 그렇지 않으면 데이터베이스 작업이 수행되지 않고 false가 반환되며 오류 정보는 yiibaseModel::errors 속성에 저장됩니다. 유효성 검사()가 명시적으로 호출된 경우 save(false) 매개 변수를 전달하여 save() 메서드에서 데이터의 반복 유효성 검사를 피할 수 있습니다. 🎜🎜🎜3. Ajax 확인: 🎜🎜🎜Yii는 기본적으로 Ajax 확인을 끄고, 활성화AjaxValidation 매개변수를 true로 구성하여 켤 수 있습니다. 🎜🎜클라이언트 설정(두 가지 방법): 🎜🎜 (1) 보기 파일 ActiveForm에서 전체 양식 설정: 🎜🎜🎜rrreee🎜🎜🎜 (2) 보기 파일 ActiveField에서 단일 필드 설정: 🎜🎜

复制代码 代码如下:

<?= $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:而是把一个属性标记为安全属性。

['desc', 'safe']

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

['add_time', 'default', 'value' => time()]

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

['username', 'trim']

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

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

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

2. 数据类型验证器

(1)boolean:布尔型。

['del', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]

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

(2)number:数字。

['salary', 'number']

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

['salary','double', 'max' => 99.99, 'min' => 0]

(4)integer:整数。

['age', 'integer']

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

(5)string:字符串。

['username', 'string', 'length' => [3, 30]]

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

3. 数据格式验证器

(1)date:日期。

['time', 'date', 'format' => 'php:Y:m:d', 'timestampAttribute' => 'startTime']

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

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

['emailAddr', 'email']

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

['ip_address', 'ip']

(4)url:网址。

['website', 'url', 'defaultScheme' => 'http']

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

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

['username', 'match', 'pattern' => '/^[a-z]\w*$/i']

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

4. 数据值验证器

(1)required:必填。

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

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

(2)captcha:验证码。

['verifyCode', 'captcha', 'caseSensitive' => true, 'captchaAction' => 'site/captcha', 'skipOnEmpty' => false]

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

(3)compare:比较。

['password', 'compare', 'compareAttribute' => 'conpassword', 'operator' => '==']

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

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

(4)each:验证数组。

['ids', 'each', 'rule' => ['integer']]

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

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

(5)exist:存在性。

['cid', 'exist', 'targetClass' => 'app\models\Category', 'targetAttribute' => 'id']

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

(6)unique:唯一性。

['email', 'unique', 'targetClass' => 'app\models\User', 'message' => '{attribute}"{value}"已被注册!', 'on' => 'signup']
除了没有allowArray属性,其他属性都和exist验证器一样。

(7)in:范围。

['sex', 'in', 'range' => [0, 1, 2]]

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

5. 文件验证器

(1)file:文件。

['pcImg', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024]

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

(2)image:图片。

['mbImg', 'image' extensions => 'png, ipg', 'minWidth' => 100, 'minHeight' => 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;
     }
}
로그인 후 복사
로그인 후 복사

模型中使用示例:

['conpassword', 'app\components\ConpasswordValidator']

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

相关推荐:

Yii2框架类自动加载机制实例分析


위 내용은 Yii2 프레임워크 데이터 검증 작업 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿