企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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')); }], ]; } ~~~