我是第一次使用Doctrine2,但我认为这个问题非常通用,不依赖于特定的ORM.
Data Mapper模式中的实体是否应该知道并使用 Mapper?
我有几个具体的例子,但它们似乎都归结为同样的一般性问题.
如果我正在处理来自外部源的数据 - 例如a User有很多Messages- 并且外部源只提供最新的几个实体(如RSS提要),$user->addMessage($message)除非它知道Mapper,否则如何检查重复项,或者它通过集合"搜索"(似乎是一件低效的事情).
当然,控制器或事务脚本可以在将消息添加到用户之前检查重复项 - 但这似乎不太正确,并且会导致代码重复.
如果我有一个大型集合 - 再次User有很多Messages- User实体如何为集合提供限制和分页而不实际代理Mapper调用?
同样,控制器或交易脚本或任何使用实体可以直接使用映射来检索集合User的Messages通过次数,日期范围或其他因素的限制-而这也将导致代码重复.
答案是使用存储库并让实体知道它们吗?(至少对于Doctrine2,以及其他ORM使用的类似概念.)此时,实体仍然与Mapper相对分离.