3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
作為業(yè)務(wù)邏輯的一切都屬于模型,無論是數(shù)據(jù)庫查詢,計(jì)算,REST調(diào)用等。
您可以在模型本身中訪問數(shù)據(jù),MVC模式不會(huì)限制您這樣做。您可以使用服務(wù),映射器和其他方法對(duì)其進(jìn)行糖涂層,但模型的實(shí)際定義是處理業(yè)務(wù)邏輯的層,僅此而已。它可以是一個(gè)類,一個(gè)函數(shù),或一個(gè)包含大量對(duì)象的完整模塊,如果這是你想要的。
擁有一個(gè)實(shí)際執(zhí)行數(shù)據(jù)庫查詢的單獨(dú)對(duì)象總是更容易,而不是直接在模型中執(zhí)行它們:這在單元測試時(shí)會(huì)特別有用(因?yàn)樵谀P椭凶⑷肽M數(shù)據(jù)庫依賴項(xiàng)很容易):
class Database { protected $_conn; public function __construct($connection) { $this->_conn = $connection; } public function ExecuteObject($sql, $data) { // stuff }}abstract class Model { protected $_db; public function __construct(Database $db) { $this->_db = $db; }}class User extends Model { public function CheckUsername($username) { // ... $sql = "SELECT Username FROM" . $this->usersTableName . " WHERE ..."; return $this->_db->ExecuteObject($sql, $data); }}$db = new Database($conn);$model = new User($db);$model->CheckUsername('foo');
此外,在PHP中,您很少需要捕獲/重新拋出異常,因?yàn)楸A袅嘶厮?,特別是在您的示例中。只是拋出異常并在控制器中捕獲它。

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
在Web-“MVC”中,您可以隨心所欲。
最初的概念(1)將模型描述為業(yè)務(wù)邏輯。它應(yīng)該代表應(yīng)用程序狀態(tài)并強(qiáng)制執(zhí)行一些數(shù)據(jù)一致性。這種方法通常被描述為“胖模型”。
大多數(shù)PHP框架遵循更簡單的方法,其中模型只是一個(gè)數(shù)據(jù)庫接口。但至少這些模型仍應(yīng)驗(yàn)證傳入的數(shù)據(jù)和關(guān)系。
無論哪種方式,如果將SQL內(nèi)容或數(shù)據(jù)庫調(diào)用分成另一層,那么你就不是很遠(yuǎn)了。這樣,您只需關(guān)注真實(shí)的數(shù)據(jù)/行為,而不是實(shí)際的存儲(chǔ)API。(但是過度使用它是不合理的。如果沒有提前設(shè)計(jì),你將永遠(yuǎn)無法用文件存儲(chǔ)替換數(shù)據(jù)庫后端。)
- 3 回答
- 0 關(guān)注
- 1525 瀏覽
添加回答
舉報(bào)