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 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo14 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack14 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820715 天前
PHP 扩展——从入门到理解
php
鹏仔先生15 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下16 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip16 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒16 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25016 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis16 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel