如何在隐式实体的学说中触发更新后事件?

问题描述 投票:0回答:1

每当 symfony-7 项目中名为

Work
的学说管理实体之一更新时,我都会尝试更新搜索索引。我使用 postUpdate-Listener 但我意识到,当相关实体中的值发生更改时,侦听器不会被执行,这有点有意义,因为我为其注册侦听器的实体的实际表在技术上没有更新。

我觉得应该有一个简单的解决方案。

#[AsEntityListener(
    event: Events::postUpdate,
    method: 'postUpdate',
    entity: Work::class,
)]
class PostUpdateIndexUpdate
{
    //constructor plus DI

    public function postUpdate(Work $work, PostUpdateEventArgs $eventArgs): void
    {
        //update logic plus logging which tells me if the listener was actually called
    }
}

我有想法为每个相关实体添加更多

AsEntityListener
属性...但这似乎是一个非常糟糕的主意,因为这可能会触发一堆索引更新,这会:

  • 造成不必要的性能影响
  • 可能需要一些逻辑来防止索引中丢失更新(并且

是否可以更优雅地捕获所有隐式更新?

php symfony doctrine-orm
1个回答
0
投票

就我而言,最方便的解决方案是将新的时间戳字段“updatedAt”添加/映射到聚合根(此处为“Work”),然后在每次修改相关实体之一时进行设置。这样,Doctrine 将仅触发一个更新事件,并且您的侦听器将捕获它。

我猜测您的所有子实体都是通过工作实体检索和修改的,因此您可以在内部更新此时间戳字段。否则,您可以使用公共

setUpdatedAt()
方法从用例服务中手动设置此值。

© www.soinside.com 2019 - 2024. All rights reserved.