【问题标题】:Persist object in PostPersist, PostUpdate events在 PostPersist、PostUpdate 事件中持久化对象
【发布时间】:2015-10-09 16:31:01
【问题描述】:

我有一个使用 Doctrine 写入数据库的记录器。我需要在 Entity ListenerPostPersistPostUpdatePreRemove 处理程序中记录一些事件。
但是在这些处理程序中,官方不支持 flush 操作(如果忽略它,有时会导致致命错误)。
我遇到了类似的question,但解决方案是将刷新推迟到当前执行的刷新结束,这不适合我,因为我需要在处理程序中插入条目,例如为了在删除操作期间不丢失对象 ID。
我有一个 LogManager 并希望这个 add-log-entry 操作相同 - 无论您是从某个处理程序还是从代码中的其他位置调用它。
我想知道有没有办法在处理程序中保留对象? (可能是通过使用另一个 EntityManager ...)

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    您可以使用onFlush 事件,我认为该事件非常适合您的需求。您必须手动重新计算/计算更改,而不是使用刷新方法。请参阅链接。

    来自 Doctrine2 文档:

    • 如果您在 onFlush 中创建并持久化一个新实体,那么调用 EntityManager#persist() 是不够的。您必须再次调用$unitOfWork->computeChangeSet($classMetadata, $entity)

    • 更改原始字段或关联要求您显式触发重新计算受影响实体的变更集。这可以通过调用$unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity) 来完成。

    【讨论】:

    • 是的,但它现在不太适合我,因为我有一个日志管理器服务,它可以在所有应用程序中使用,而不仅仅是在这些处理程序中。而且我遇到了您建议的几乎相同的情况(除了我使用 postFlush),并且它一直运行良好,直到我在 preRemove 处理程序中添加了这个非常登录,这使我遇到了我没有删除对象的 id 冲洗操作。所以我寻找一些更独立的安全日志记录方式(当我可以在应用程序的任何地方使用这个记录器时)。
    • 这是一种可能的变体吗?你觉得再来一个怎么样?
    • 我不确定我是否理解得很好。在 onFlush(不是 postFlush 也不是 preFlush)中,您可以获得所有将要插入、删除或更新的实体。您还有将被删除的实体的 ID。
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多