2011-11-14 55 views
2

現在是我理解MVC的時候了,所以這就是我想要做的;我無法得到模型應該做的事情。據Wikipedia,模型:MVC模型,它們的用途是什麼?

模型管理的行爲和應用領域的數據, 響應請求有關其狀態(通常是從 視圖)的信息,並響應指令來改變狀態(通常來自 控制器)。在事件驅動的系統中,該模型通知觀察者 (通常是視圖)何時信息發生變化,以便他們能夠做出反應。

而且在CakePHP中,你理應建立一個模型,在這個非常簡單的方法:

<?php 

class Posts extends AppModel { 
    var $name = 'Posts'; 
} 

?> 

所以,如果我想要的,例如,在過去10個職位在我的數據庫,我想創建一個控制器這將是這個樣子:

<?php 

class PostsController { 
    function retrieve_latest($number = 10) { 
     $posts = $this->Users->find(array(
       'fields' => '*', 
       'order' => 'posts.post_id DESC', 
       'limit' => $number, 
       'page' => '1', 
       'conditions' => array('posts.post_display == 1') 
     )); 

     $this->set('posts', $posts); 
    } 
} 

?> 

這傢伙會通過一個名爲posts我的看法變量,那麼這將使其相應。問題是,我的模型是不是應該做其他任何事情?因爲如果它如此簡單,定製模型根本就沒有意義,我的意思是,它只是模型類的一個空的擴展。

+0

思考模型最簡單的方法是對數據進行數據存儲和對界面(視圖)不可知的數據操作。換句話說,假裝你爲你的業務問題創建一個API,而沒有特定的接口知識。控制器和視圖有這方面的知識...... – bryanmac

+0

'AppModel'實例與MVC的模型層無關。它們只是activerecord的實例。 –

回答

5

這個「模型類的空白擴展」已經做了很多事情:它連接到數據庫並完成所有的檢索和保存數據的分鐘處理。它應該做更多的事情,雖然,包括舉辦validation rules這是強制執行,任何時候你正在寫的數據庫,所有數據在before/after filters按摩必要和任何其他自定義業務邏輯您在應用程序的需要。模型用於存儲您的中心業務數據邏輯,所以任何與表示或輸入/輸出不相關的內容都將模擬應用程序的核心邏輯。僅僅因爲基礎設置簡單並不意味着他們沒有更多。

4

模型還封裝業務邏輯並處理彼此之間的交互。例如,如果帖子有評論,那麼這是在模型中處理的內容。你不希望控制器獲取帖子,然後獲取評論並組裝它們。這將把知道模型結構的責任放在控制器上,它不屬於它。

確實有很多應用程序,其中模型不包含非常多的邏輯(如果有的話)。只有數據字段和沒有業務邏輯的模型可以被認爲是DTO(數據傳輸對象),或者只是一個「對象」,因爲它不能「模擬」任何類型的業務邏輯。這不一定是壞事,它取決於需求。許多應用程序都是簡單的數據應用程序,並且不需要任何其他邏輯。

但是,如果您的應用程序擁有的邏輯不僅僅是任何給定表中的數據,那麼邏輯將進入模型。他們不只是模擬數據,他們模擬域。事實上,模型不直接具有相同的數據庫結構並不罕見。模型是面向對象的,而數據庫更常用於關係。這兩個並不總是以相同的方式解決問題。如果你的模型需要完全複製你的表格,那麼你就限制了更多面向對象的功能。

簡而言之,任何解釋業務所做的事情都會進入模型。控制器只是事件處理程序,響應用戶界面請求。控制器通常是針對手頭的應用程序定製的,而模型應該可以跨多個應用程序重用,因爲它們代表了業務邏輯的核心。

1

要使用你的例子,理想的是薄控制器和胖模型。這意味着你的代碼最好應重構爲以下幾點:

class Post extends AppModel { 
    var $name = 'Post'; 

    function retrieveLatest($limit = 10) { 

     return $this->find('all', array(
      'order'=>'Post.id'=>'DESC', 
      'limit'=>$limit 
     ); 

    } 

} 


class PostsController extends AppController { 

    function retrieve_latest($limit) { 

     $posts = $this->Post->retrieveLatest($limit); 

     $this->set(compact('posts')); 

    } 

} 

你的控制器不應該是什麼neccessary複雜的細節關注,以獲取最新的,這就是業務邏輯和雲模型,接近到數據。另一個好處是,你還可以檢索任何相關模型將最新的帖子:

$posts = $this->User->Post->retrieveLatest(); 

你甚至可以去一個階段進一步和retrieveLatest()的代碼進入你的AppModel所以每一個模型將繼承它:

class AppModel extends Model { 

    function retrieveLatest($limit = 10) { 

     $model = $this->alias; 

     return $this->find('all', array(
      'limit'=>$limit, 
      'order'=>array(
       $model . ".id"=>'DESC' 
      ) 
     ); 

    }  

} 

作爲一個經驗法則,任何時候當你發現自己在你的控制器中建立查詢時,將它們移動到模型中並給它們一個描述性的名字。

相關問題