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'
相关推荐
IT=>小脑虎3 小时前
PHP零基础衔接进阶知识点【详解版】
开发语言·学习·php
xifangge20254 小时前
PHP 接口跨域调试完整解决方案附源码(从 0 到定位问题)
开发语言·php
ICT董老师5 小时前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
bleach-5 小时前
buuctf系列解题思路祥讲--[SUCTF 2019]CheckIn1--文件上传以及user.ini的应用
nginx·web安全·网络安全·php
BingoGo6 小时前
免费可商用商业级管理后台 CatchAdmin V5 正式发布 插件化与开发效率的全面提升
vue.js·后端·php
AI 智能服务18 小时前
第6课__本地工具调用(文件操作)
服务器·人工智能·windows·php
松涛和鸣20 小时前
49、智能电源箱项目技术栈解析
服务器·c语言·开发语言·http·html·php
晚枫歌F21 小时前
io_uring的介绍和实现
开发语言·php
Tisfy1 天前
网站访问耗时优化 - 从数十秒到几百毫秒的“零成本”优化过程
服务器·开发语言·性能优化·php·网站·建站
xifangge20251 天前
PHP 错误日志在哪里看?Apache / Nginx / PHP-FPM 一次讲清
nginx·php·apache