鍍金池/ 問答/PHP/ php模型和控制器之間交互

php模型和控制器之間交互

學(xué)習(xí)使用的是Tp5.1

在看別人代碼的時候想很多關(guān)于數(shù)據(jù)庫的操作之間寫到控制器里面了;

public function save()
{
    $data = input('post');
    $validate = $this->validate($data,"app\\common\\TestValidate");
    
    $result = (new UserModel)->save($data);
    
    if($result){
        return $this->success('操作成功');
    }else{
        return $this->success('操作失敗');
    }
}

但是有人說這樣就沒必要用模型,可以將寫入數(shù)據(jù)的方法寫到model里面

但是寫在model中在控制器調(diào)用的時候如何判斷是否寫入成功呢?
還有就是將數(shù)據(jù)驗(yàn)證是應(yīng)該寫在控制器還是模型??

比如用戶注冊 前端提交->控制器接收請求->模型
這之中的數(shù)據(jù)驗(yàn)證寫到控制器還是模型

如果寫到控制器沒什么疑問,但是如果寫到模型

模型中驗(yàn)證失敗返回false 咋樣返回錯誤信息呢? 難道說模型中返回一個數(shù)組['status'=>0,'msg'=>'手機(jī)號碼已經(jīng)被注冊'];

之后由控制器接收模型返回的該數(shù)組 判斷返回的status嗎?

還有順便問問服務(wù)層和邏輯層該如何運(yùn)用??

問題有點(diǎn)多,希望大家告知下,多謝!

回答
編輯回答
悶騷型

1.MVC了解一下!邏輯控制寫在控制器,數(shù)據(jù)處理寫在model里。
2.控制器調(diào)用model中的方法,model的方法執(zhí)行成功或者失敗返回布爾值,然后控制器根據(jù)布爾值來判斷執(zhí)行的結(jié)果。
3.答案1

2017年8月5日 19:13
編輯回答
毀憶

MVC里最重要的就是M,也就是model,控制器只是做中轉(zhuǎn),所有和數(shù)據(jù)或者數(shù)據(jù)庫打交道的地方一般放到model里去做,有些框架會把model層再細(xì)分為service層和logic層

2018年5月1日 15:57
編輯回答
做不到

你看到的應(yīng)該是很多普遍存在的一種形式,或者說是使用某種框架然后偏離了我們的初衷!
首先對于編程設(shè)計思想MVC來說,我們已經(jīng)將前后端分離了,那么我們也繼續(xù)在后端將控制器和模型處理也分離,那么我們的數(shù)據(jù)處理確實(shí)應(yīng)該寫在model里面,控制器只是負(fù)責(zé)調(diào)度

2018年8月3日 03:31
編輯回答
我甘愿

如果完全遵循MVC的話,數(shù)據(jù)處理肯定放model啊,然后controller負(fù)責(zé)調(diào)用model 然后根據(jù)model返回的數(shù)據(jù)來進(jìn)行邏輯處理,TP中model也是可以validate的。

服務(wù)層就是model的一個分層service,一起分出來的還有l(wèi)ogic,他們就是對model的一個分離,service負(fù)責(zé)提供給controller的接口,而logic幫助controller處理邏輯。
比如驗(yàn)證 可以model只做增刪改查,logic調(diào)用model做判斷并且處理邏輯 再返回給service。
就是為了降低方法之間的耦合

2018年1月12日 12:21
編輯回答
過客

我覺得樓主問的重點(diǎn)應(yīng)該是這一行:

模型中驗(yàn)證失敗返回false 咋樣返回錯誤信息呢? 難道說模型中返回一個數(shù)組['status'=>0,'msg'=>'手機(jī)號碼已經(jīng)被注冊'];

如果把處理數(shù)據(jù)的代碼都放到模型中,有時通過后要返回數(shù)據(jù),不通過需要返回錯誤提示信息,在控制器中要作出判斷確實(shí)有些麻煩。

統(tǒng)一返回的數(shù)據(jù)格式為['status'=>0/1,'info"=>msg/data] 確實(shí)是一種方法。
但寫起來總覺得有些麻煩。

當(dāng)然,返回的 msg 一般是 string,而返回的 data 一般是 array,所以,通過判斷返回的數(shù)據(jù)類型也是可以考慮的。(但有時又會有特例)

所以,還是直接寫到控制器中比較方便。

如果數(shù)據(jù)處理的邏輯比較復(fù)雜,而且可能在其它控制器中會用到,那么,寫到模型中去。
如果邏輯比較簡單,其它控制器中不可能用到,寫到控制器中比較方便。

你要追求嚴(yán)謹(jǐn),就要犧牲“便利性”!
然而,PHP 是一門很追求“便利性”的語言。

2017年3月31日 15:57
編輯回答
不二心

按道理來說是應(yīng)該寫在model中,但是現(xiàn)在數(shù)據(jù)庫查詢各種AR封裝方法就是方便你直接寫的,所以簡單的直接在controller中:

(new UserModel)->save($data);

難道還需要特意在model中再封裝一下?

public function saveUser(){
    self::save();
}

也許有人覺得統(tǒng)一封裝后方便修改,但現(xiàn)在IDE中批量修改也很方便,而且基本不會出現(xiàn)這種情況,個人是感覺沒必要,簡單的數(shù)據(jù)庫交互可以直接在controller中寫,復(fù)雜的而且需要復(fù)用的交互才需要放在model中。

2018年4月21日 09:56