很抱歉一开始给您错误的答案,这应该会引导您朝着正确的方向前进(请注意,它并不完美)。
您需要实现两个事件。一个监听 OnFlush 事件,行为如下:
// This should listen to OnFlush events
public function updateLastModifiedTime(OnFlushEventArgs $event) {
$entity = $event->getEntity();
$entityManager = $event->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
if (count($unitOfWork->getScheduledEntityInsertions()) > 0 || count($unitOfWork->getScheduledEntityUpdates()) > 0) {
// update the user here
$this->user->setLastModifiedDate(new \DateTime());
}
}
我们需要等待 OnFlush 事件,因为这是我们访问所有将要完成的工作的唯一机会。请注意,我没有在上面包含它,但是$unitOfWork->getScheduledEntityDeletions()
如果您想跟踪它,也有。
接下来,您需要另一个监听 PostFlush 事件的最终事件监听器,如下所示:
// This should listen to PostFlush events
public function writeLastUserUpdate(PostFlushEventArgs $event) {
$entityManager = $event->getEntityManager();
$entityManager->persist($this->user);
$entityManager->flush($this->user);
}
不幸的是,一旦交易开始,就为时已晚,无法获得拯救另一个实体的教义。因此,我们可以在 OnFlush 处理程序中对对象的字段进行更新User
,但实际上我们不能将其保存在那里。(您可能可以找到一种方法来做到这一点,但 Doctrine 不支持它,并且必须使用 UnitOfWork 的一些受保护的 API)。
但是,一旦事务完成,您可以立即执行另一个快速事务来更新用户的日期时间。是的,这确实有一个不幸的副作用,即不在单个事务中执行。