Easyswoole驗證器Validate—自定義錯誤信息
最近公司在用easyswoole開發項目,在用官方自帶基礎的驗證類時,遇到點問題,已經解決,現記錄下來。
因為工作中需要用到的數據校驗,除了對傳入的字段做基礎的校驗,還有其他比較復雜的校驗,需要自定義錯誤信息。參照官方文檔的寫法
其實就是EasySwoole\Validate\Rule中的func方法中的第二個參數$msg在這兒並沒有起到作用
分析原因,追溯到源碼去看:
EasySwoole\Validate\Error類中:
1)獲取錯誤信息:$validate->getError()->__toString(這個是追溯問題的源頭,因為返回的信息不是我們預先想要的)
2)獲取觸發規則消息
3)構造方法
4)這個地方是Error定義的默認錯誤信息
最后發現問題出在EasySwoole\Validate\Validate的validate()方法中這段代碼:
原來官方的代碼是:拿那個func方法中的閉包返回的值$result,如果$result為true,就說明驗證通過,不會顯示錯誤信息。
否則,經過strval方法得到$resultErr,作為errorRuleMsg去判斷,如果$resultErr存在且非空非零,就使用$reultErr來作為錯誤信息,
否則在就用官方默認func對應的錯誤信息”:fieldName自定義驗證失敗”
所以,如果要使用自定義的錯誤信息,就只能類似這樣寫:
下面是在控制器中的寫法,供參考
$dids = $this->request()->getRequestParam('dids');
$pid = $this->request()->getRequestParam('id');
$disaster_id = $this->request()->getRequestParam('disaster_id');
$validate=new Validate();
$validate->addColumn('id','表單元素ID')->required('不能為空')->integer('必須是整數');
$validate->addColumn('disaster_id','災難ID')->required('不能為空')->integer('必須是整數');
$dids_arr=explode(',',$dids);
$validate->addColumn('dids','部門ID')->required('不能為空')->regex("/^\d+(,\d+)*$/",'有多個的話,用英文逗號隔開')->func(function ($params,$key) use($dids_arr){
foreach ($dids_arr as $k=>$v){
$form_value_info=TagDepModel::create()->where('did',$v)->get();
if(!$form_value_info){
return "填寫的部門ID不存在";
}
}
return true;
});
if (!$this->validate($validate)){
return $this->returnJson(static::PARAMS_BAD,[],$validate->getError()->getFieldAlias().$validate->getError()->__toString());
}