Symfony 在预更新事件中插入实体

Symfony 在预更新事件中插入实体,symfony,doctrine-orm,Symfony,Doctrine Orm,每当更新消息时,我都试图持久化历史实体。我有太多的幕后工作要做,无法在这里发布所有代码,也无法让它有意义,但我基本上一直在跟踪问题,直到UnitOfWork::commit方法。在那里,UOW首先在entityInsertions中循环,没有找到任何内容,然后继续执行entityUpdates。UOW的entityInsertions在那里得到更新,但由于它已经通过了该循环,它没有意识到它仍然需要持久化某些实体。有没有办法强制UOW“重新启动”此过程?如果是,怎么做?我用的是第2.4条 谢谢你的

每当更新
消息
时,我都试图持久化
历史
实体。我有太多的幕后工作要做,无法在这里发布所有代码,也无法让它有意义,但我基本上一直在跟踪问题,直到
UnitOfWork::commit
方法。在那里,UOW首先在
entityInsertions
中循环,没有找到任何内容,然后继续执行
entityUpdates
。UOW的
entityInsertions
在那里得到更新,但由于它已经通过了该循环,它没有意识到它仍然需要持久化某些实体。有没有办法强制UOW“重新启动”此过程?如果是,怎么做?我用的是第2.4条


谢谢你的帮助

这可能是有史以来最肮脏的解决方案,但我最终做的基本上是以下几点

  • 创建一个
    onFlush
    事件订阅服务器
  • 将整个容器注入订阅服务器(仅注入实体管理器将导致循环引用错误)
  • 循环通过
    UnitOfWork
    scheduledEntityUpdates
    scheduledEntityInserts
    (我对删除不感兴趣)
  • 处理您感兴趣的每个计划更新或插入(在我的例子中,我用
    LoggableInterface
    标记了我感兴趣的每个实体,只是为了知道哪些实体是可记录的)
  • 使用处理程序链处理相关对象(这只是我自己的算法,您可能不需要这样做。这是为了以不同的方式处理不同
    LoggableInterface
    对象的日志记录而设置的)
  • 通过实体管理器持久化实体(实际历史事件),并执行以下操作:

    $classMeta = $this->entityManager->getClassMetadata(get_class($historyEntity));
    $this->entityManager->getUnitOfWork()->computeChangeSet($classMeta, $historyEntity);
    
  • 利润


  • 希望这对别人有帮助

    您必须至少发布预更新代码。如果您要持久化另一个实体,我认为您需要通知UoW安排您的插入。