在Doctrine postFlush事件

时间:2017-02-24 09:25:43

标签: php symfony doctrine-orm doctrine

考虑Symfony应用程序中的后续步骤:

  1. 为Doctrine的postFlush事件注册侦听器,以转储工作单元getScheduledEntityInsertions()的结果。
  2. 创建SomeEntity类的实例。
  3. 使用先前创建的实体实例
  4. 调用实体管理器的persistflush方法
  5. postFlush听众解雇
  6. getScheduledEntityInsertions()致电没有回复
  7. 预期的行为是,在最后一步,我看到了插入实体的列表,但是如果你看一下UoF的executeInserts()方法,unset($this->entityInsertions[$oid])为每个实体调用,那么nothig从{{1}返回打电话。

    Iam发现该案例被拒绝补丁:https://github.com/doctrine/doctrine2/pull/5674和Ocramius建议使用“onFlush”事件来收集所有需要的数据并触发自定义事件:https://groups.google.com/forum/#!topic/doctrine-user/GLJEx0p5kL4

    但是,我不明白,它是如何完成的:如果我为getScheduledEntityInsertions()注册自定义侦听器并从myCustomEvent使用未插入实体列表触发它 - 它将在实体实际保存之前执行到数据库(onFlush已激活)并且无法从此侦听器中的数据库接收。

1 个答案:

答案 0 :(得分:3)

可能的解决方案之一是为onFlushpostFlush事件使用一个Listener类,并在onFlush使用必要数据填充内部属性,在postFlush中读取数据属性。但是这个解决方案有局限性:两个侦听器方法都必须定义为相同的类;监听器不是线程安全的。