2012-04-16 77 views
3

我在項目中獲得一個好的文件夾結構時遇到了一些麻煩,我想知道我可以使用哪些其他方式來構造我的文件。如何構建MVC模型和ORM模型

我目前正在一個MVC結構文件夾中工作。

www/ 
    Controllers/ 
    Models/ 
    Views/ 

到目前爲止沒有什麼特別的。但我也在使用ORM系統。有了它,我可以很容易地從我的數據庫就像得到一個「對象」:

ORM::load('table'); 

現在這種代碼應該駐留在模型吧?所以我會得到這樣的東西:

<?php 
class userModel 
{ 
    public function getAllUsers () 
    { 
     return ORM::load('table'); 
    } 

    public function getUserById ($id) 
    { 
     return ORM::load('table', 'userid=?', array($id)); 
    } 
} 
?> 

在我看來目前看起來不錯......但還有一件事。我也可以在使用ORM系統時指定'模型'。有了這個模型,我基本上可以設置驗證規則。像這樣:

ORM::withModel('authModel'); 

這使ORM知道,在它增加了一個新的行(或更新現有的一個)到數據庫,它應該首先檢查以下模型驗證規則。

<?php 
class authModel //Or maybe authValidation?? 
{ 
    // Method gets automatically triggered when an update is done with the ORM 
    public function onUpdate ($obj) 
    { 
     if ($obj->username == '') 
      throw new \Exception('No username'); 
    } 

    public function onInsert ($obj) 
    { 
     // Validations here too. 
    } 
} 
?> 

現在的問題是,我有2種模型。其中我基本上使用getters/setter來獲取和存儲數據到數據庫(從我的控制器到我的模型)。

而我有另一個模型,其中設置了驗證規則......我不想在同一個文件夾中混合使用這兩個模型。所以我必須爲此提出另一個結構。喜歡的東西:

www/ 
    Controllers/ 
    Models/ 
    Repositories/ 
    Entities/ 
    Views/ 

這只是我的模型是不是一個真正的「倉庫」,因爲它沒有存儲在回購類中的任何對象,並沒有commit()方法之類的東西。

我也不能存儲在實體文件夾中的第2個型號(驗證),因爲他們不是實體在所有...

任何想法,我應該如何構建這個..?

+0

受益匪淺? – 2012-04-16 07:34:32

+6

@webbandit因爲我創建了自己的'框架'來獲得更多的經驗。我知道我可以輕鬆使用其他框架。但我也想通過這樣做來學習,我自己也是這麼做的。 – Vivendi 2012-04-16 07:56:02

回答

10

您應該瞭解的第一件事是MVC中的模型不是類/對象。它是一個由衆多對象組成的圖層。我懶得做同樣的song'n'ance,所以只是讀this comment(跳到「旁註」部分)。

混淆的根源在於,您認爲您稱爲「模型」的課程組中有兩項不同的責任。實際上,您負責業務邏輯的類實例(例如UserModel類)以及一個名爲「ORM」的單獨事件,用於加載和存儲內容。而且你有身份驗證,這不適合任何一個組。

我會去與這樣的結構:

/application 
    /modules 
     /public 
      /controllers 
      /templates 
     /admin 
      /controllers 
      /templates 
     .... 
    /views 
    /model 
     /logic 
     /persistence 
     /services 
/framework 

您可能注意到了存在/application一個單獨的文件夾/views而且每個模塊都有獨立的/templates。這是因爲,在正確的MVC中,視圖是類的實例,負責表示邏輯並且通常處理多個模板。如果寫得好,它們也是可重用的結構。

最後一點:不要嘗試使用ORM。爲每個需要它的域對象創建一個數據映射器。有些人認爲ORMs to be antipatterns。另外,避免靜態調用..這不是OO代碼。你爲什麼不使用一些準備去farmeworks與像Kohana的ORM,你可以從學習dependency injection

..我的2美分

+0

雖然我必須不同意ORM是真正的反模式(有些人會說回購模式相同)。我不認爲這是糟糕的。我仍然會使用它。但是這是另外一個討論。但是你給了我關於結構部分的一些很好的見解:-) – Vivendi 2012-04-17 10:16:30

+1

@Vivendi,我只是希望你閱讀關於ORM的文章,而不是把它作爲一個你不同意的東西作爲一個原則問題。 – 2012-04-17 11:49:27