最全面的Yii2的Model规则rules校验Validate使用方法

本文详细介绍了Yii2框架中Model层数据验证的各种规则,包括基本类型、布尔型、比对、日期等,并探讨了如何在beforeValidate方法中实现复杂业务逻辑和自定义错误信息。掌握这些将提升模型验证的灵活性和效率。
摘要由CSDN通过智能技术生成

前言

作为经典三层架构MVC中的数据模型Model层,通常和数据库紧密连接,在数据读写之前,做数据的校验。

Yii2作为目前比较流行的PHP框架,在Model层也做了非常完善的封装。

下面是最全面的Model层数据验证的写法,各位可以根据自己的实际情况在自己的model中使用各自的方法。

rules()基本类型支持

rules()对应的是当前模型的字段,如果是对应数据库的表,就是对应表中的字段,gii生成的rules()是默认和表限制一样的,如果是自定义的表单,就需要自己对字段进行限制了。

    public function rules()
    {
        return [
            [['ad_id', 'updated_at'], 'required'],
            [['ad_id', 'size_code', 'updated_at'], 'integer'],
            [['title'], 'string', 'max' => 128],
        ];
    }

boolean(布尔型)

['selected', 'boolean'],

compare(比对)

['password', 'compare', 'compareAttribute' => 'password_repeat'],

date(日期)

	[['from_datediandianxiyu_geek', 'to_datediandianxiyu_geek'], 'date'],
    [['from_datetimediandianxiyu_geek', 'to_datetimediandianxiyu_geek'], 'datetime'],
    [['some_timediandianxiyu_geek'], 'time'],

default(默认值)

 ['blog', 'default', 'value' => 'diandianxiyu_geek'],

double(双精度浮点型)

['salary', 'double'],

each(循环验证)

验证数组

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

email(电子邮件)

 ['email', 'email'],

exist(存在)

['diandianxiyu_geek', 'exist'],

file(文件)

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

filter(过滤器)

['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true],

image(图片)

    ['primaryImage', 'image', 'extensions' => 'png, jpg',
        'minWidth' => 100, 'maxWidth' => 1000,
        'minHeight' => 100, 'maxHeight' => 1000,
    ],

ip(IP地址)

['ip_address', 'ip'],

in(范围)

['level', 'in', 'range' => [1, 2, 3]],

integer(整数)

['age', 'integer'],

match(正则表达式)

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

number(数字)

['salary', 'number'],

required(必填)

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

safe(安全)

安全字符是不进行验证的要注意。

['description', 'safe'],

string(字符串)

 ['username', 'string', 'length' => [4, 24]],

trim(去空格)

[['username', 'email'], 'trim'],

unique(唯一性)

['a1', 'unique'],

url(网址)

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

写在beforeValidate自动校验前

上面的验证方法,可以满足一些基本的业务需求,但是一般业务的需要更为复杂,需要我们单独写方法去做验证。

比如如果是新数据就写入创建时间,不是新数据就不需要。

比如需要验证数据是否合法,都可以写在beforeValidate().

数据填充

    public function beforeValidate()
    {
        $this->status = self::STATUS_ONLINE;
        if($this->isNewRecord){
            $this->created_at = time();
        }
        $this->updated_at = time();
        return parent::beforeValidate();
    }

复杂业务判断

    public function beforeValidate()
    {
        if('判断业务条件'){
            $this->addError('title', 'XXX【'.$this->title.'】已经存在');
        }
        return parent::beforeValidate();
    }

addError 添加错误信息

当我们在模型中通过业务判断主动返回某个字段的错误信息,那么这个错误信息就会通过表单模板中的{error}展示给用户。

并且,如果存在错误的话,模型save方法默认调用的验证方法Validate也不会通过,这样也就不会完成表单提交。

总结

Yii2 的数据model层的操作,是以数据表作为基础的。

  1. gii能默认根据数据库字段自动写入默认验证规则
  2. 我们在实际业务中,再调整验证规则
  3. beforeValidate的重写可以完成数据写入和数据校验,并能自定义返回的信息
  4. addError方法在模型中很有用,可以不允许表单验证通过保存
可以使用required属性来确保下拉框必须选择一个选项,也可以使用自定义的校验规则验证下拉框的选项是否符合要求。例如,可以使用Vue.js的v-validate指令来定义一个自定义规则,如下所示: <select v-model="selected" v-validate="'required'"> <option value="">请选择</option> <option v-for="option in options" :value="option.value">{{ option.label }}</option> </select> 在这个例子中,我们使用了Vue.js的v-model指令来绑定下拉框的选项,使用v-validate指令来定义校验规则。我们将校验规则设置为'required',表示下拉框必须选择一个选项。如果用户没有选择任何选项,将会显示一个错误消息。 如果你需要更复杂的校验规则,可以使用自定义的校验函数来实现。例如,你可以定义一个函数来检查下拉框的选项是否符合某些特定的要求,如下所示: <select v-model="selected" v-validate="{ custom: validateOption }"> <option value="">请选择</option> <option v-for="option in options" :value="option.value">{{ option.label }}</option> </select> 在这个例子中,我们使用了一个自定义的校验函数validateOption来检查下拉框的选项是否符合要求。我们将校验规则设置为{ custom: validateOption },表示使用自定义的校验函数来校验下拉框的选项。如果校验函数返回false,将会显示一个错误消息。 总之,element表单验证规则rules可以通过required属性或自定义的校验规则校验下拉框的选项是否符合要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雨青年

程序员可以把咖啡转化成代码~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值