使用Doctrine 2 / DataMapper,如何在域层中保留新实体?

时间:2013-10-04 00:15:07

标签: symfony doctrine-orm datamapper

我有一个带有几个实体的树状结构:一个过程由步骤组成,一个步骤可能有子过程。假设我有2种失败模式:中止和重做。我实现了树遍历逻辑,在树上上下级联失败信号。在中止的情况下,一切都很顺利;中止正确上下流动,通知其父母及其子女。在重做的情况下,同样的情况发生,除了创建一个新进程以替换失败的进程。因为我正在使用DataMapper模式,所以新对象无法自行保存,也没有办法将新对象传递给EntityManager以实现持久性,因为实体不了解持久性甚至服务。

因此,如果我没有将EntityManager传递给域层,那么如何在新对象超出范围之前了解它们呢?

这是实现AOP的好例子,例如JMSAopBundle吗?这是我读过的,但还没有找到有效的用例。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题(你的描述似乎有点匆匆写了),我会做以下事情:

  • 使用某种标志(即脏标志)标记失败的节点和新节点
  • 让树迭代器计算失败和新节点的数量
  • 根据需要重复进行树迭代/重新执行,直到不再需要处理失败或新节点为止

答案 1 :(得分:0)

我刚刚从Benjamin Eberlei那里找到了关于域层中业务逻辑变化的更为抽象的贡献:Doctrine and Domain Events

博客文章的简短引述和摘要:

  

域事件模式允许将事件附加到实体和   只有当事务处理时才将它们分派给事件监听器   实体已成功执行。这有几个好处   传统的事件调度方法:

     
      
  • 重点关注域中的行为以及域触发的更改。
  •   
  • 以非常简单的方式促进脱钩
  •   
  • 除了Doctrine UnitOfWork之外,没有引用事件调度程序和所有必需的侦听器。
  •   
  • 无需使用在所有更新操作中触发的无法显式的Doctrine Lifecycle事件。
  •   

每个需要采取行动的方法都应该:

  1. 使用事件名称和属性调用“raise”方法。
  2. “raise”方法应创建一个新的DomainEvent对象,并将其设置为存储在内存中实体中的事件数组。
  3. 事件监听器应该监听Doctrine生命周期事件(例如postInsert),将实体保存在内存中(a)实现事件,(b)有事件要处理。
  4. 此事件侦听器应在包含感兴趣的实体和任何相关信息的preFlush / postFlush回调中调度新的(自定义)事件。
  5. 第二个事件监听器应该监听这些自定义事件并触发必要的逻辑(例如onNewEntityAddedToTree)
  6. 我还没有实现这个,但听起来它应该以我实际实现的方法更自动化的方式完成我正在寻找的东西。