Yii2.0 模型规则(rules)详解

一、基本语法结构

php 复制代码
public function rules()
{
    return [
        // 规则1
        [['attribute1', 'attribute2'], 'validator', 'options' => value, ...],
        
        // 规则2
        ['attribute', 'validator', 'options' => value, ...],
        
        // 规则3...
    ];
}

二、规则类型分类

1、核心验证器(内置验证器)

格式验证类:

  • boolean:验证是否为布尔值
  • email:验证是否为有效邮箱格式
  • string:验证是否为字符串
  • number:验证是否为数字
  • double:验证是否为浮点数
  • integer:验证是否为整数
  • date:验证是否为日期格式
  • time:验证是否为时间格式
  • datetime:验证是否为日期时间格式
  • url:验证是否为有效URL
php 复制代码
['email', 'email'],
['age', 'integer'],
['website', 'url', 'defaultScheme' => 'http'],

范围验证类:

  • in:验证是否在给定列表
  • notIn:验证值是否不在给定列表中
  • range:验证数值是否在范围内
  • compare:比较两个属性的值
php 复制代码
['status', 'in', 'range' => [1, 2, 3]],
['priority', 'compare', 'compareValue' => 10, 'operator' => '>='],

存在性验证:

  • required: 验证是否为必填
  • default:验证默认值(非严格验证)
  • exist:验证值是否存在与数据库中
  • unique:验证值在数据库中是否唯一
php 复制代码
[['username', 'password'], 'required'],
['category_id', 'exist', 'targetClass' => Category::class, 'targetAttribute' => 'id'],
['email', 'unique', 'targetClass' => User::class],

其他验证:

  • filter: 数据过滤
  • match:正则表达式验证
  • trim:去除首尾空格
  • safe:标记属性为安全(不验证)
php 复制代码
['username', 'match', 'pattern' => '/^[a-z]\w*$/i'],
['content', 'filter', 'filter' => 'strip_tags'],
['auth_key', 'default', 'value' => Yii::$app->security->generateRandomString()],

2、行内验证器

在模型内部定义方法

php 复制代码
public function rules()
{
    return [
        ['password', 'validatePassword'],
    ];
}

public function validatePassword($attribute, $params)
{
    if (strlen($this->$attribute) < 8) {
        $this->addError($attribute, '密码长度不能少于8个字符');
    }
}

3、匿名函数验证器

php 复制代码
public function rules()
{
    return [
        ['agree', function($attribute, $params) {
            if ($this->$attribute != 1) {
                $this->addError($attribute, '必须同意条款');
            }
        }],
    ];
}

三、高级规则配置

1、条件验证(when)

php 复制代码
['state', 'required', 'when' => function($model) {
    return $model->country == 'USA';
}],

2、客户端验证

php 复制代码
['captcha', 'captcha', 'captchaAction' => 'site/captcha', 'skipOnEmpty' => false],

3、指定场景验证(on/except)

php 复制代码
['password', 'required', 'on' => 'register'],
['email', 'required', 'except' => 'guest'],

4、空值处理

php 复制代码
['description', 'default', 'value' => null], // 允许为空
['status', 'required', 'skipOnEmpty' => false], // 不允许空字符串

四、规则选项详解

通用选项

选项 说明 示例 解释 用法 结果
message 定义错误信息 'message'=> '{attribute}不能为空' {attribute}为占位符 \['username', 'password', 'required', 'message'=> '{attribute}不能为空'] username不能为空或者password不能为空
skipOnEmpty 为空时是否跳过验证 'skipOnEmpty' => true
skipOnError 当属性已有错误时是否跳过 'skipOnError' => true
when 条件验证回调 'when' => function($model) { ... }
on 适用场景 'on' => 'create', 'update'
except 排除场景 'except' => 'delete'
相关推荐
东宇科技12 小时前
让网页执行cmd命令
php
持敬chijing14 小时前
PHP开发-环境搭建-安装phpstudy-vscode工具
开发语言·vscode·php
MC皮蛋侠客15 小时前
TDengine C++ 系列(6):高性能写入——参数绑定、批量与 Schemaless
c++·php·tdengine
Hello_Damon_Nikola15 小时前
AC7911从入门到精通
开发语言·嵌入式硬件·物联网·php
sbjdhjd17 小时前
大三网安秋招核心学习前言(AI 安全 + Web 漏洞 + 内网渗透全考点)
人工智能·网络协议·学习·安全·网络安全·开源·php
运维行者_18 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
吴声子夜歌19 小时前
正则指引——PHP
开发语言·正则表达式·php
Claire_8819 小时前
企业文件管理系统选型技术框架与主流产品对比分析
开发语言·php
COOLMO研究AI20 小时前
Python 如何给 AI API 实现断路器模式:防止雪崩与保护本地服务
人工智能·python·php
AC赳赳老秦20 小时前
网页公开附件自动采集:OpenClaw 批量下载页面内嵌 Word/Excel 附件,统一格式后结构化入库
java·python·word·php·excel·deepseek·openclaw