[TOC]
# 自定义验证器
除了使用那些自带的验证规则以外,如果它们不能满足你的校验需求,还可以自己定义验证器:
~~~php
public function rules(){
return [
//验证规则是一个方法名称,这个方法指向当前模型的一个public方法
['username', 'myMethod']
];
}
public function myMethod(){
if(strpos($this->username, 'fuck!') !== false){
$errorFlag = 'username'; //随便,一般用被校验的属性名,比如 username
$this->addError($errorFlag, '用户名称出现了敏感词汇!');
}
}
~~~
然后validate的时候就会自动调用myMethod方法来按照你的逻辑去校验username了
当校验不成功的时候就调用addError来添加一个错误消息,这样的话外面就能通过`errors`或`firstErrors`属性来取得错误消息了
# each验证器
如果要验证的属性是一个数组,希望里面每一个元素都必须是整数的话,可以用这个验证器
~~~php
public function rules(){
return [
['deleteIds', 'each', 'rule' => ['integer']]
];
}
~~~
each就是要求每一个元素都符合rule的要求,而rule的书写方式又是一个数组,里面第一个元素是验证器别名,其它用key来定义这个验证器的更多内容就是了(你就理解为验证器嵌套吧),比如
~~~php
public function rules(){
return [
['deleteIds', 'each', 'rule' => ['integer', 'min' => 1]]
];
}
~~~
和平时使用验证规则一样是相通的,知道integer是指[yii\\validators\\NumberValidator](http://www.yiichina.com/doc/api/2.0/yii-validators-numbervalidator)后,找到里面的属性$min再定义到这个rule里进行属性注入即可
# exist验证器
经常用于校验一个ID属性什么的是否在数据库里存在,比如这样:
~~~php
public function rules(){
return [
['id', 'exist', 'targetClass' => 'app\models\User']
];
}
~~~
`targetClass`指定了**目标类**,目标类必须是一个[AR模型](http://www.kkh86.com/it/yii2/guide-db-ar-base.html),然后exist验证器就会去查一下AR模型对应的表中有没有`WHERE id = $表单->id`的记录,有的话就认为校验通过
# 当表单模型属性与AR模型表字段属性命名不一致时的存在性校验
假设有一个收发消息的功能,消息记录表有个**sender\_id**(发送者)和**receiver\_id**(接收者),表单模型要往user表中校验id字段,但表单模型是这样定义属性的:
~~~php
public $senderId = 0;
public $receiverId = 0;
~~~
如果这样定义规则:
~~~php
public function rules(){
return [
['senderId', 'exist', 'targetClass' => 'app\models\User'],
['receiverId', 'exist', 'targetClass' => 'app\models\User'],
];
}
~~~
就会造成验证器去找user表的senderId字段和receiverId字段,但并没有这两个字段啊,查询就会出错
实际上我们希望找id字段来确定用户是否存在,可以通过`targetAttribute`来指定模型的哪个属性(字段)
~~~php
public function rules(){
return [
['senderId', 'exist', 'targetClass' => 'app\models\User', 'targetAttribute' => 'id'],
['receiverId', 'exist', 'targetClass' => 'app\models\User', 'targetAttribute' => 'id'],
];
}
~~~
如果有更多需求,详细用法请见官方文档
# unique 唯一验证器
这个通常用来校验注册邮箱或手机号什么的
~~~php
public function rules(){
return [
['email', 'unique', 'targetClass' => 'app\models\User'],
];
}
~~~
就是校验user表的email字段是否有相同的值,有就不通过,没有就可以;也能像exist验证器那样通过targetAttribute来指定要校验的字段
# 预处理
一些string类型的输入参数我们通常都希望提前trim一下空格,不然也会成功通过string的length校验(不会自动trim)
那难道先在控制器里取值,trim掉再传给表单模型吗?——不用,直接用trim过滤器就行
~~~php
public function rules(){
return [
[['username', 'email'], 'trim'],
['username', 'string', 'length' => [2, 10]],
['email', 'email'],
];
}
~~~
# 默认值
有些字段不是required的,或者有默认值的,方法1是在类里面声明的时候就定义默认值:`public $isDelete = 1`
要不就在规则里定义默认值:
~~~php
public function rules(){
return [
//如果这样我宁愿默认在属性定义里,做人不能太死脑筋吧
['isDelete', 'default', 'value' => 1],
//支持动态计算默认值
[['from', 'to'], 'default', 'value' => function ($model, $attribute) {
return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days'));
}],
];
}
~~~
- 目录
- 配置
- 简介
- 别名
- gii
- 配置项
- 模型
- 简介
- 增删改查
- AR和model
- 模型事件
- 场景
- query查询
- 增删改
- AR查询器
- 模型关系定义
- AR模型连表查询
- fields
- where拼接
- 模块
- 创建模块
- 控制器
- 表单
- 跳转
- 响应
- 验证器
- Action
- 组件
- url
- 分页
- 验证码
- 缓存
- 文件上传
- 预启动组件
- 事件
- 自定义组件
- redis
- 日志
- 行为
- cookie和session
- 基础知识
- 创建一个类
- 配置一个类
- object基类
- component组件类特性
- phpstorm无法更改php等级
- url地址美化
- 过滤器
- 请求处理
- 请求组件
- 响应组件
- header
- 用户登录
- 实现IdentityInterface接口
- 登录
- 自动检测登录
- 获取用户信息
- 访问行为追踪
- phpstorm+postman断点调试