一、写在前面:
在使用yii2.0的过程中,在编写代码时候难免出现错误,或者说是异常;
有时候我们可以看出来,例如:table_name 不存在;这在我们编写form的model时候非常常见,原因在于你的字段没有声明,比如表单中的重复密码的字段,验证码字段;都要在model的里面声明属性:public $repassword;public $verfiCode都要声明,不然会报表不存在的异常;
有时候第一次可能我们看不出来:这就是我所经历的,大部分出现在操作model的时候,或者是创建,或者是更新的时候,然后总结出的经验是在操作model的时候,90%的错误都出现在rule的字段编写上,或者是字段写错误。或者是规则声明错误;
我们以yii\validators\...这个类展开;
二、怎么查看错误:
相对来说,yii框架的提示还是比较完整,准确的,我们应该去了解下基本的异常;比如ForbiddenException;HttpException等等;
1.首要的当然是看标题:比如:
Unknown Property – yii\base\UnknownPropertyException;
Setting unknown property: yii\validators\RangeValidator::value;
第一行就很明显了,就是问题出现在字段上,不知道这个属性;当然这个范围很大了;第二行中的yii\validators就表明:验证出现问题,就是rules的问题,接下来你的重点就要放在rule字段的规则定义上了;
2.我们再看里面的详细内容,从下向上,果然我们发现了蛛丝马迹,错误就出现在我定义用户的状态时候,本来是status range是一个变化的范围,而我却写成value了。
三、yii\validator相关:
1.场景:我新建修改管理员信息的form时候,需要去更新其中的管理员信息;如下:
if(!$this->validate()){
return null;
}
$user = AdminUser::findOne(\Yii::$app->user->identity->id);
$user->username = $this->username;
$user->email = $this->email;
$user->password_hash = \Yii::$app->security->generatePasswordHash($this->password);
$user->brief = $this->brief;
return $user->save() ? $user : null;
结果实验了N次,validate竟然是通过的;当时蒙逼的我静静的看着代码但问题是更新就不成功;爆出了上面所写的错误;明明是validators啊。。我分析了半天,既然这个model里面没问题,那么就是它的父级model的字段验证出现了问题,导致数据更新失败;user里面的rule只有一条:
public function rules()
{
return [
['status','default','value'=>self::STATUS_ACTIVE],
['status','in','value'=>[self::STATUS_LOCK,self::STATUS_ACTIVE]],
];
}
没错,就是这样,我才发现了in是在一个范围;应该是range;粗心导致bug的出现,
2.yii\validators\..::....格式的错误;
这样的异常一般都是rule字段验证错误所爆出的异常;
类似的在vender\yiisoft\yii\validators\下面有着定义,去验证字段符合规则:
BoleanValidator.php 是对 字段的验证
['字段名', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true];
CompareValidator.php 是对比较字段的验证
['字段名','compare','另一字段',compareValue=>20
EmailValidator.php 是对字段email格式的验证
['字段名', 'email']
..........详细了解的可自行查看源码:
四、总结:
程序抛出:yii\validator\.........,都是字段role定义上出现的问题、别去别处找。