2011-07-16 114 views
3

我目前正在研究一個大型項目,並且只是想知道哪個是最佳實踐,可以將實體和實體集合單獨建模或集中在一個類中?在Zend框架中建模

目前,我爲每個實體(例如'author'和'authors'class)實現了兩個類,其中複數類包含像'fetch authors'這樣的方法(複數使用Zend_Db_Table_Abstract,單數使用Zend_Db_Table_Row_Abstract)。

但是我意識到我經常在單個實體的對象中看到像'fetch/list'這樣的函數,這看起來相當整潔,因爲我不必擁有許多文件。

我知道數據建模沒有硬性規定,但在我繼續太遠之前,我有興趣瞭解關於最佳實踐的一般共識(當然還有支持論據! )。

回覆[意見]感謝收到!

羅布Ganly

回答

4

就個人而言,我更喜歡叫Person真正代表一個人,像一個PersonCollection模型來表示人的集合模型。在任何情況下,我是否有獲取/獲取這些對象的方法。相反,我會將這些方法放在PersonRepositoryPersonMapper類中。

這實際上是我最大的不適與ActiveRecord作爲建模模式的不適。通過使用像find()save()這樣的方法,它爲getPersonByName(),getPersonsWithMinimumAge()等方法打開了大門。這些方法非常好,沒有錯,但是我認爲它們在語義上更適合於映射器或存儲庫類。讓Model實際建模,將持久性和檢索留給映射器和存儲庫。

所以,爲了更直接地解決你的問題,我看到每個「實體類型」潛在三類:

  1. Person - 實際上模型的人
  2. PersonCollection - 擴展一些抽象的集合類,每個項目Person類
  3. PersonMapper - 持久性和Person對象的檢索和PersonCollections

控制器將使用映射器來持久化並檢索模型和集合。

我被Doctrine2吸引也許並不奇怪。那裏有作爲持久性和檢索的單一接觸點的功能。然後,我可以創建使用EntityManager定製功能的存儲庫和服務。然後,我可以在動作助手或工廠或依賴注入容器上分層,以便輕鬆獲取/創建這些存儲庫和服務。

但我知道標準的ActiveRecord方法是相當常見的,很好理解,並且非常主流。使用它可以獲得良好的效果,並且可以找到許多立即瞭解它並可以很好地使用它的開發人員。

與大多數情況一樣,YMMV。

+0

我更喜歡「相同」的概念。唯一的區別是:沒有Collection對象,我的Mapper返回的模型數組很多「集合」。我喜歡它簡單:-) – opHASnoNAME

+1

@ ArneRie:是的,我承認我並不總是走收集路線。但只要它實現了Iterator接口,我就可以像使用數組一樣使用它。原則上,它允許集合本身具有某些屬性和行爲的靈活性:'$ fishCaughtInTheNet-> getNumberOfDistinctSpecies()','$處方 - > haveNotableInteractions()'。 '$ locations-> areWithinRadius($ someRadius)'。有趣的東西就是這樣,但在標準的類似CRUD的應用程序中可能不是那麼重要。謝謝,歡呼! ;-) –

+0

http://martinfowler.com/eaaCatalog/dataMapper.html - 是或可以作爲快速入門/手冊的參考。所以Zend也推薦使用DataMapper-Pattern。 –