我目前正在从事一个大型项目,我只是想知道哪种最佳做法是分别为实体和实体集建模还是在一个类中建模?
目前我正在为每个实体实现两个类(例如“作者”和“作者”类),其中复数类包含像“获取作者”这样的方法(使用 Zend_Db_Table_Abstract 表示复数,使用 Zend_Db_Table_Row_Abstract 表示单数)。
但是我意识到我经常在单个实体的对象中看到诸如“获取/列表”函数之类的方法,就我不必拥有那么多文件而言,这看起来非常简洁。
我知道数据建模没有硬性规定,但在我继续深入之前,我有兴趣了解关于最佳实践的普遍共识是什么(当然还有支持论据!) .
非常感谢回答[意见]!
罗布·甘利
最佳答案
就我个人而言,我更喜欢使用名为 Person
的模型来实际表示一个人,而使用类似 PersonCollection
的模型来表示一组人。在这两种情况下,我都会有获取/获取这些对象的方法。相反,我会将这些方法放在 PersonRepository
或 PersonMapper
类中。
这确实是我对 ActiveRecord 作为建模模式最大的不满。通过像 find()
和 save()
这样的方法,它打开了像 getPersonByName()
、getPersonsWithMinimuAge() 这样的方法的大门
等。这些方法很棒,没有任何问题,但我认为从语义上讲,它们在映射器或存储库类上工作得更好。让 Model
实际建模,将持久性和检索留给映射器和存储库。
因此,为了更直接地解决您的问题,我看到每个“实体类型”可能分为三个类:
Person
- 实际上是一个人的模型PersonCollection
- 扩展一些抽象集合类,类 Person 的每个项目PersonMapper
-Person
对象和PersonCollections
的持久化和检索
Controller 将使用映射器来保存和检索模型和集合。
我被 Doctrine2 所吸引可能并不奇怪。 EntityManager
用作持久性和检索的单一联系点。然后,我可以创建使用 EntityManager
实现自定义功能的存储库和服务。然后我可以在操作助手或工厂或依赖项注入(inject)容器上分层,以便轻松获取/创建这些存储库和服务。
但我知道标准的 ActiveRecord 方法非常普遍、易于理解并且非常主流。您可以使用它获得良好的结果,并且可以找到许多立即理解它并且可以很好地使用它的开发人员。
在大多数情况下,YMMV。
关于php - Zend 框架中的建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6720058/