Zend框架中的建模技术

3
我目前正在进行一个大型项目,想知道哪种做法是最佳实践,是将实体和实体集分别建模还是在一个类中建模?
目前,我为每个实体实现了两个类(例如“作者”和“作者们”类),其中复数类包含诸如“获取作者”的方法(使用Zend_Db_Table_Abstract用于复数和Zend_Db_Table_Row_Abstract用于单数)。
然而,我意识到我经常看到单个实体对象中的“获取/列出”函数,这似乎非常简洁,因为我不需要拥有太多文件。
我知道数据建模没有硬性规定,但在我继续深入之前,我很想了解一下这方面的最佳实践一般共识(当然还有支持论点!)。
感谢您提供答案[意见]!
1个回答

4
个人而言,我更喜欢使用名为“Person”的模型来表示单个人,并使用名为“PersonCollection”的模型来表示人的集合。在这两种情况下,我都不会在这些对象上放置fetch/get方法。相反,我会将这些方法放在一个名为“PersonRepository”或“PersonMapper”的类中。
这是我对ActiveRecord作为建模模式最不舒服的地方。通过拥有像find()和save()这样的方法,它为getPersonByName()、getPersonsWithMinimumAge()等方法打开了大门。这些方法很好,没有问题,但我认为从语义上讲,它们在mapper或repository类中更适合。让Model真正地进行建模,将持久性和检索留给mapper和repository。
因此,为了更直接地回答您的问题,我认为每个“实体类型”可能有三个类:
1. Person - 实际上对人进行建模 2. PersonCollection - 扩展某个抽象集合类,每个条目都是Person类 3. PersonMapper - 对Person对象和PersonCollections进行持久化和检索
控制器将使用mapper来持久化和检索模型和集合。
可能并不意外的是,我被Doctrine2所吸引。EntityManager在那里充当持久性和检索的单一联系点。然后,我可以创建使用EntityManager进行自定义功能的repositories和services。然后,我可以添加action helpers、factories或dependency injection containers来轻松获取/创建这些repositories和services。
但我知道标准的ActiveRecord方法非常常见,被很好地理解,并且非常主流。您可以使用它获得良好的结果,并可以找到许多立即理解它并能够很好地使用它的开发人员。
就像大多数事情一样,YMMV。

我更喜欢“同样”的概念。只有一个区别:没有集合对象,我的映射器将作为模型数组返回“集合”。我喜欢简单 :-) - opHASnoNAME
1
@ArneRie:是的,我承认我并不总是使用集合路线。但只要它实现了迭代器接口,我就可以像使用数组一样使用它。原则上,它确实允许集合本身具有属性和行为:$fishCaughtInTheNet->getNumberOfDistinctSpecies()$prescriptions->haveNotableInteractions()$locations->areWithinRadius($someRadius)。这些都很有趣,但在您的标准CRUD应用程序中可能并不是那么关键。谢谢和干杯!;-) - David Weinraub
http://martinfowler.com/eaaCatalog/dataMapper.html - 作为快速入门/手册的参考。Zend也推荐使用DataMapper模式。 - Julius F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接