上下文
想象一下,我有一个铁路网络:Station
由Rail
链接在一起。
Maintenance
实体)。Station
可以通过将destructionDate
属性设置为不同于NULL的内容来销毁实体。Stations
Rail
之间存在“ManyToMany with attributes”关系
Station
已连接/断开连接Station
以及何时关联,因此在我的Rail
实体中我有一个connectionDate
和一个{{1属性。我想做什么
disconnectionDate
)时,会删除相应的$rail->setDisconnectionDate(now())
个实体。Maintenance
)时,相应的$station->setDestructionDate(now())
将被断开(即Rail
)并删除相应的$rail->setDisconnectionDate($station->getDestructionDate
实体。如何解决
目前,我在控制器的动作中触发事件,它运行正常。但问题是他们在我的应用程序中有很多方法可以断开2个站点或者破坏一个站点而不是所有的母鸡都通过控制器。我需要确保不要错过Station破坏或铁路断开。
所以我在考虑实体中的触发事件,例如在Maintenance
方法中。我在网上搜索,显然这不是一个好主意。
我想使用Doctrine postUpdate事件,但即使未修改destroyDate也会触发它们。我可以过滤它,但我不确定这是最好的事情。
那么,你将如何解决这个问题?在这种情况下,最佳做法是什么?
答案 0 :(得分:2)
您可以创建EventSubscriber并收听preUpdate或onFlush事件。 在preUpdate中,您可以访问已更改的内容。
例如:
class YourEventListener implements EventSubscriber {
public function getSubscribedEvents()
{
return array(
Events::preUpdate => 'preUpdate'
);
}
public function preUpdate(PreUpdateEventArgs $eventArgs){
$entity = $eventArgs->getEntity();
$em = $eventArgs->getEntityManager();
if($entity instanceof Rail){
if($eventArgs->hasChangedField('disconnectionDate')){
//do something
}
}
}
}