每当 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
属性...但这似乎是一个非常糟糕的主意,因为这可能会触发一堆索引更新,这会:
是否可以更优雅地捕获所有隐式更新?
就我而言,最方便的解决方案是将新的时间戳字段“updatedAt”添加/映射到聚合根(此处为“Work”),然后在每次修改相关实体之一时进行设置。这样,Doctrine 将仅触发一个更新事件,并且您的侦听器将捕获它。
我猜测您的所有子实体都是通过工作实体检索和修改的,因此您可以在内部更新此时间戳字段。否则,您可以使用公共
setUpdatedAt()
方法从用例服务中手动设置此值。