自己寫的在模型中返回一個(gè)數(shù)組由控制器根據(jù)參數(shù)響應(yīng)給視圖,代碼如下
1:瀏覽器post請求控制器;
2:控制器實(shí)例化用戶模型
3:模型中接受到全部的數(shù)據(jù)存入$Data變量
4:利用驗(yàn)證器驗(yàn)證數(shù)據(jù)合法性,如果驗(yàn)證不通過返回status為:0;并且返回msg:錯(cuò)誤信息
5:模型總save新增數(shù)據(jù)
6:新增成功返回1:提示新增成功 新增失敗返回0:表示新增失敗:
控制器代碼:
//roue:member/index/userAdd
public function userAdd(){
$Result = (實(shí)例化會員模型)->add();
//中間可能還有其他操作
return ajaxReturn($Result['status'],$Result['msg']);
}
模型代碼
public function add(){
$Data = input('');
$Validate= new UserAddValidate($Data);
if(false === $Result){
//如果嚴(yán)重失敗會返回false
//返回狀態(tài)0,內(nèi)容為:msg
return ['status',=>0,'msg'=>$Validate->getError()];
}
//執(zhí)行新增
$res = $this->save($Data);
if($res){
return ['status'=>1,'msg'=>'添加會員成功'];
}else{
return ['status'=>0,'msg'=>'添加會員失敗'];
}
}
這個(gè)是自己琢磨的 但是感覺好麻煩,每次都要各種的if判斷
所以我就去看別人的代碼,看到一個(gè)大神些的利用的是tp5的自定義異常處理類,代碼寫法如下
控制器代碼:
//roue:member/index/userAdd
public function userAdd(){
return (實(shí)例化會員模型)->add();
}
模型代碼
public function add(){
$Data = input('');
$Validate= new UserAddValidate($Data);
if(false === $Result){
throw new HttpException([
'status' => 0,
'msg' => $Validate->getError();
]);
}
$res = $this->save($Data);
if($res){
throw new HttpException([
'status' => 1,
'msg'= > '添加會員成功',
]);
}else{
throw new HttpException([
'status' => 0,
'msg'= > '添加會員失敗',
]);
}
}
HttpException 是TP5里面可以自定義的一個(gè)異常處理類 最終結(jié)果就是拋出異常,異常中的內(nèi)容是json后的結(jié)果,
感覺這種相對來說很好用,但是不知道為什么大多數(shù)人的代碼都沒用用這種呢?
或者還有什么更好的辦法嗎?
以上代碼全是在瀏覽器中手寫的,可能會有一點(diǎn)點(diǎn)的誤差!
你只是想返回一個(gè)結(jié)果,但使用 throw 一般是拋出異常。
很多時(shí)候返回 status 為0,其實(shí)并不是異常。
我覺得這些時(shí)候使用 throw 是不合適的。
所謂的異常,應(yīng)該是“它本來應(yīng)該是這樣的,但結(jié)果卻不是”,才需要拋出異常。
比如你要處理一張圖片,傳的參數(shù)指向的文件存在,文件后綴也存在,但讀取數(shù)據(jù)后卻不能正確處理,這時(shí)拋個(gè)異常是可以理解的,但我個(gè)人覺得這還不夠好。
因?yàn)槲揖陀龅竭^,使用 thinkPHP 3.2 的圖片處理類,遇到不能處理的圖片,直接拋出了異常,但其實(shí)對我來說,如果處理圖片有問題 ,是可以直接跳過去的。
也就是說:只有“這一步如果出錯(cuò),后面的代碼執(zhí)行就完全沒有意義或者完全不能執(zhí)行”的時(shí)候才去拋出異常,否則只需要返回結(jié)果,給使用者(可能是控制器)去處理就好了。
對于樓主的需求,ThinkPHP 是有內(nèi)置的方法的,比如控制器中有 success() 和 error() 兩種方法來滿足樓主的需要,當(dāng)然,我個(gè)人比較喜歡 ThinkPHP 3.2的處理方式,比如簡潔,ThinkPHP 5中的這兩個(gè)方法添加了不必要的參數(shù),寫起來倒挺麻煩的。
但這兩個(gè)方法只在控制器中有,模型中默認(rèn)是沒有的,當(dāng)然,如果你喜歡的話,也可以加到模型中去。
但我個(gè)人同樣不太推薦。處理返回結(jié)果或頁面跳轉(zhuǎn)的任務(wù)還是交給控制器會比較好。
模型中,其實(shí)可以自己定義個(gè)類似的方法,比如:
function succ($data="",$status=1){
return array(
'status'=>$status,
'info'=>$data,
);
}
function error($msg=""){
return succ($msg,0);
}
你在模型中直接 return succ($data);或 return error($msg);即可。
控制器中根據(jù)返回的數(shù)組,再使用$this->success()或$this->error();當(dāng)然,如果你在使用ThinkPHP 5,也像我一樣比較喜歡 ThinkPHP 3.2 的風(fēng)格,這兩個(gè)方法你是可以改成3.2的風(fēng)格的。
說回樓主和你看到的大神的代碼,基本思想都差不多,只不過你直接返回一個(gè)數(shù)組,而“大神”卻直接拋出異常,我不喜歡這位大神的風(fēng)格。
但你和“大神”都喜歡寫重復(fù)的 "status'=>1,"msg"=>......,我則比較喜歡把它裝進(jìn)函數(shù)或方法中,畢竟這兩個(gè)操作是使用非常頻繁的。
關(guān)于代碼中較多 if/else 的情況,我一般使用兩種方法解決:
但如果把樓主看到的“大神”的代碼從模型中移到控制器的話,應(yīng)該是合理的(除了重復(fù)的代碼有點(diǎn)多外)。
我個(gè)人是不太喜歡使用 throw,但我查看了一下 ThinkPHP 5 和 ThinkPHP 3.2 的源碼,其中的 success和 error 方法除了使用參數(shù)復(fù)雜性不同外,還有一點(diǎn)區(qū)別就是 3.2直接使用 exit()結(jié)束程序,而 5.0 版本中使用的是 throw 一個(gè)異常類。
應(yīng)該有理由相信,使用 throw 可能會比如說 exit 更好。
于是,我找到一種說法:
PHP調(diào)用exit退出腳本執(zhí)行不會導(dǎo)致PHP服務(wù)退出。
https://segmentfault.com/q/10...
我不了解底層的機(jī)制,但我覺得這種說法是比較可信的。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。