我有一个使用Doctrine在DB中写入的记录器。我需要在Entity Listener的Doctrine PostPersist
,PostUpdate
和PreRemove
处理程序中记录一些事件。
但是在这些处理程序中,flush
操作在官方上是不受支持的(有时会因忽略它而导致致命错误)。
我遇到过类似的question,但解决办法是将刷新推迟到当前正在执行的刷新的末尾,这不适合我,因为我需要在处理程序中插入条目,例如为了在移除操作期间不丢失对象id
我有一个LogManager
并希望这个add-log-entry
操作是相同的 - 无论你是从某个处理程序还是从代码中的其他地方调用它。
我想知道有没有办法在处理程序中保留对象? (可以使用另一个EntityManager ...)
答案 0 :(得分:1)
您可以使用我认为适合您需求的onFlush活动。您必须手动重新计算/计算更改,而不是使用flush方法。请参阅链接。
来自Doctrine2文档:
如果在onFlush中创建并保留新实体,则调用EntityManager#persist()是不够的。您必须再次拨打$unitOfWork->computeChangeSet($classMetadata, $entity)
。
更改原始字段或关联要求您显式触发受影响实体的变更集的重新计算。这可以通过致电$unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity)
。