一、寫在前面:
? ? ? ? 在使用yii2.0的過程中亡呵,在編寫代碼時候難免出現(xiàn)錯誤硫戈,或者說是異常;
? ? ? ?有時候我們可以看出來,例如:table_name 不存在汁胆;這在我們編寫form的model時候非常常見,原因在于你的字段沒有聲明誉尖,比如表單中的重復(fù)密碼的字段铸题,驗證碼字段;都要在model的里面聲明屬性:public $repassword;public $verfiCode都要聲明丢间,不然會報表不存在的異常;
? ? ? 有時候第一次可能我們看不出來:這就是我所經(jīng)歷的烘挫,大部分出現(xiàn)在操作model的時候,或者是創(chuàng)建涡驮,或者是更新的時候喜滨,然后總結(jié)出的經(jīng)驗是在操作model的時候捉捅,90%的錯誤都出現(xiàn)在rule的字段編寫上虽风,或者是字段寫錯誤∥耷#或者是規(guī)則聲明錯誤厂抖;
? ? ?我們以yii\validators\...這個類展開茎毁;
二忱辅、怎么查看錯誤:
? ? 相對來說,yii框架的提示還是比較完整橡卤,準(zhǔn)確的,我們應(yīng)該去了解下基本的異常碧库;比如ForbiddenException;HttpException等等嵌灰;
? ? 1.首要的當(dāng)然是看標(biāo)題:比如:
Unknown Property?–?yii\base\UnknownPropertyException;
Setting unknown property: yii\validators\RangeValidator::value粘茄;
第一行就很明顯了秕脓,就是問題出現(xiàn)在字段上儒搭,不知道這個屬性吠架;當(dāng)然這個范圍很大了搂鲫;第二行中的yii\validators就表明:驗證出現(xiàn)問題,就是rules的問題魂仍,接下來你的重點(diǎn)就要放在rule字段的規(guī)則定義上了;
? ? 2.我們再看里面的詳細(xì)內(nèi)容俱诸,從下向上赊舶,果然我們發(fā)現(xiàn)了蛛絲馬跡睁搭,錯誤就出現(xiàn)在我定義用戶的狀態(tài)時候笼平,本來是status ?range是一個變化的范圍,而我卻寫成value了锌唾。
三夺英、yii\validator相關(guān):
? ? ? 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;
? 結(jié)果實(shí)驗了N次秋麸,validate竟然是通過的;當(dāng)時蒙逼的我靜靜的看著代碼但問題是更新就不成功;爆出了上面所寫的錯誤驯耻;明明是validators啊。可缚。我分析了半天,既然這個model里面沒問題帘靡,那么就是它的父級model的字段驗證出現(xiàn)了問題,導(dǎo)致數(shù)據(jù)更新失斏轩勘;user里面的rule只有一條:
public function rules()
? ? {
? ? ? ? return [
? ? ? ? ? ['status','default','value'=>self::STATUS_ACTIVE],
? ? ? ? ? ['status','in','value'=>[self::STATUS_LOCK,self::STATUS_ACTIVE]],
? ? ? ? ];
? ? }
沒錯,就是這樣绊寻,我才發(fā)現(xiàn)了in是在一個范圍;應(yīng)該是range澄步;粗心導(dǎo)致bug的出現(xiàn)冰蘑,
? ? ?2.yii\validators\..::....格式的錯誤村缸;
? ? 這樣的異常一般都是rule字段驗證錯誤所爆出的異常;
? ?類似的在vender\yiisoft\yii\validators\下面有著定義搪柑,去驗證字段符合規(guī)則:
? ?BoleanValidator.php ?是對 ?字段的驗證
['字段名',?'boolean',?'trueValue'?=>?true,?'falseValue'?=>?false,?'strict'?=>?true];
? ?CompareValidator.php 是對比較字段的驗證
['字段名','compare','另一字段',compareValue=>20
? ?EmailValidator.php 是對字段email格式的驗證
['字段名',?'email']
..........詳細(xì)了解的可自行查看源碼:
四索烹、總結(jié):
?程序拋出:yii\validator\.........,都是字段role定義上出現(xiàn)的問題百姓、別去別處找。